/ Hex Artifact Content
Login

Artifact 2551bd3ecb8b8988fb8b23aabadfb214dbc38e46:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
55d0: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
55e0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
55f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5610: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5620: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5640: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5660: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5670: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5690: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
56a0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
56b0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
56c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
56d0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
56e0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
56f0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5700: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5710: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5720: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5730: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5740: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5750: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5760: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5770: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5780: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5790: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
57a0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
57b0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
57c0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
57d0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
57e0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
57f0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5800: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5810: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5820: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5830: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5840: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5850: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5860: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5870: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5880: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5890: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
58a0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
58b0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
58c0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
58d0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
58e0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
58f0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5900: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5910: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5920: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5930: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5940: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5950: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5960: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5970: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5980: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5990: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
59a0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
59b0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
59c0: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
59d0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
59e0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
59f0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5a00: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5a10: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5a20: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5a30: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5a40: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5a50: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5a60: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5a70: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5a80: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
5a90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
5aa0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
5ab0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
5ac0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
5ad0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
5ae0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5af0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5b00: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5b10: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5b20: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5b30: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5b40: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5b50: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5b60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5b70: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5b80: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
5b90: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5ba0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
5bb0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
5bc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
5bd0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
5be0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
5bf0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
5c00: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
5c10: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
5c20: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
5c30: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
5c40: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
5c50: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
5c60: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
5c70: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
5c80: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
5c90: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
5ca0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
5cb0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
5cc0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
5cd0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
5ce0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5cf0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
5d00: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
5d10: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
5d20: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
5d30: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
5d40: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
5d50: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5d60: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
5d70: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
5d80: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
5d90: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
5da0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5db0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
5dc0: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
5dd0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
5de0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
5df0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
5e00: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
5e10: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
5e20: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
5e30: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
5e40: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
5e50: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
5e60: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
5e70: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
5e80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5e90: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5ea0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5eb0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5ec0: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5ed0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5ef0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
5f10: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
5f20: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
5f30: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
5f40: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5f50: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5f60: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5f70: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5f80: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
5f90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
5fa0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
5fb0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
5fc0: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
5fd0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
5fe0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
5ff0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6000: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6010: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6020: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6030: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6040: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6050: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
6060: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
6070: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
6080: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6090: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
60a0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
60b0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
60c0: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
60d0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
60e0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
60f0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6100: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6110: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6120: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6130: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6140: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6150: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
6160: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
6170: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
6180: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
61a0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
61b0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
61c0: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
61d0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
61e0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
61f0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6200: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6210: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6220: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6230: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6240: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6250: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
6260: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
6270: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
6280: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6290: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
62a0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
62b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
62c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
62d0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
62e0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
62f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6300: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6330: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6340: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
6350: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
6360: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
6370: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
6380: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
6390: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
63a0: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
63b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
63c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
63d0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
63e0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
63f0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
6400: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
6410: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
6420: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6430: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
6440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6450: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
6460: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
6470: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6480: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
6490: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
64a0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
64b0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
64c0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
64d0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
64e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
64f0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
6500: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
6510: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
6520: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
6530: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6540: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
6550: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
6560: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
6570: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
6580: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
6590: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
65a0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
65b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
65c0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
65d0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
65e0: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
65f0: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
6600: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
6610: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
6620: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
6630: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
6640: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
6650: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
6660: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
6670: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
6680: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
6690: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
66a0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
66b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66d0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
66e0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
66f0: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
6700: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
6710: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
6720: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
6730: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
6740: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
6750: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
6760: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
6770: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
6780: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6790: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
67a0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
67b0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
67c0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
67d0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
67e0: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
67f0: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6800: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6810: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6820: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
6830: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
6840: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
6850: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6860: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6870: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6880: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
6890: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
68a0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
68b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
68c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
68d0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
68e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
68f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6900: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6910: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6920: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6930: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6940: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6950: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6960: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6980: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6990: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
69a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
69b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69c0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69d0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
69e0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
69f0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6a00: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6a10: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a20: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a30: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a40: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a50: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a60: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6a80: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6a90: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6aa0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6ab0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6ac0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6ad0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b00: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6b10: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b30: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b40: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b50: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b60: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6b80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6b90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6ba0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6bb0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6bc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6be0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6bf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6c00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6c10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c30: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c50: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c60: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c70: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6c80: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6c90: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6ca0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6cb0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6cc0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cd0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6ce0: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6cf0: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6d00: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6d10: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d20: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d40: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d70: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6d80: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6d90: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6da0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6db0: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6dc0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6dd0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6de0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6df0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6e00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6e10: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e20: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e30: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e40: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e50: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e60: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e70: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6e80: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6e90: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6ea0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6eb0: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ec0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6ed0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6ee0: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6ef0: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6f00: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6f10: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f20: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f30: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f40: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f50: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f60: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f70: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6f80: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6f90: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6fa0: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6fb0: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fc0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6fd0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6fe0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
6ff0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7000: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
7010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7020: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7030: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7040: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
7050: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
7060: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
7070: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7080: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
7090: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
70a0: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
70b0: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
70c0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
70d0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
70e0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
70f0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
7100: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
7110: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
7120: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
7130: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
7140: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
7150: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
7160: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
7170: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
7180: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
7190: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
71a0: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
71b0: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
71c0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
71d0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
71e0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
71f0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
7200: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
7210: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
7220: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7230: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
7240: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
7250: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
7260: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7270: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
7280: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
7290: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
72a0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
72b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
72c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
72d0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
72e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72f0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7300: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
7310: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7320: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
7330: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
7340: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
7360: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
7370: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
7380: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44  VALID ){.    *pD
7390: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
73a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
73b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
73c0: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Next==0 );.    *
73d0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
73e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7400: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7410: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7420: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7430: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7440: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7450: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7460: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7470: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7480: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7490: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
74a0: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
74b0: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
74c0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
74d0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
74e0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
74f0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7510: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7520: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7530: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7540: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7550: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7560: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7570: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7580: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7590: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
75a0: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
75b0: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
75c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
75d0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
75e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
75f0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7600: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7610: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7620: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7630: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7640: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7660: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7670: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7680: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7690: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
76a0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
76b0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
76c0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
76d0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
76e0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
76f0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7700: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7710: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7720: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7730: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7740: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7750: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7760: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7770: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7780: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
7790: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
77a0: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
77b0: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
77c0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
77d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
77e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
77f0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7800: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
7810: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
7820: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7830: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7840: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
7850: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7860: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
7870: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
7880: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
7890: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
78a0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
78b0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
78c0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
78d0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
78e0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
78f0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
7900: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
7910: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7920: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
7930: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7940: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7950: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
7960: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
7970: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7980: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
7990: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
79a0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
79b0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
79c0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
79d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
79e0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
79f0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
7a00: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
7a10: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
7a20: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
7a30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
7a40: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
7a50: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
7a60: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
7a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7a80: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
7a90: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7aa0: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
7ab0: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
7ac0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
7ad0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7ae0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7af0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7b00: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7b10: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7b20: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7b30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7b40: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7b50: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7b60: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7b70: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7b80: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7b90: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7ba0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7bb0: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
7bc0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
7bd0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
7be0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7bf0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7c00: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
7c10: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c20: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7c30: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7c40: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7c50: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7c60: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7c70: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7c80: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7c90: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7ca0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7cb0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7cc0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7cd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7ce0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7cf0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7d00: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7d10: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7d20: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7d30: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7d40: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
7d50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
7d70: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
7d80: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
7d90: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7da0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
7db0: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
7dc0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7dd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7de0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
7df0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
7e00: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7e10: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7e20: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
7e30: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7e40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7e50: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
7e60: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
7e70: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
7e80: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7e90: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
7ea0: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
7eb0: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
7ec0: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
7ed0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
7ee0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
7ef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7f00: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
7f10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f30: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7f40: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
7f50: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
7f60: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
7f70: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
7f80: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
7f90: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7fa0: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
7fb0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
7fc0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
7fd0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7fe0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
7ff0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
8000: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
8010: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8020: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8030: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8040: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8050: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8060: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8070: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8080: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8090: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
80a0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
80b0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
80c0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
80d0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
80e0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
80f0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
8100: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
8110: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8120: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8130: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
8140: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8150: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
8160: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8170: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8180: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
8190: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
81b0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
81c0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
81d0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
81e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8200: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
8210: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
8220: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
8230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8240: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
8250: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8260: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
8270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8280: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
8290: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
82a0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
82b0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
82c0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82d0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
82e0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
82f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8300: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8310: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8320: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8330: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8340: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8350: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8360: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8370: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8380: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
8390: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
83a0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
83b0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
83c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
83d0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
83e0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
83f0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
8400: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
8410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8420: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
8430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8440: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8450: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8460: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8470: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8480: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
8490: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
84a0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
84b0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
84c0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
84d0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
84e0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
84f0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
8500: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
8510: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
8520: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
8530: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8540: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8550: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8560: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8570: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8580: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
8590: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
85a0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
85b0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
85c0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
85d0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
85e0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
85f0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
8600: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
8610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8620: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
8630: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8640: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8650: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8660: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8670: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8680: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
8690: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
86a0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
86b0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
86c0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
86d0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
86e0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
86f0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8700: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8710: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8720: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
8730: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8740: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8750: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8760: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8770: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8780: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
8790: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
87a0: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
87b0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
87c0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
87d0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
87e0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
87f0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
8800: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
8810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8820: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8840: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8850: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8860: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8870: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8880: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8890: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
88a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
88b0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
88c0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
88d0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
88e0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
88f0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8900: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
8910: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8920: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8930: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8940: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8950: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8960: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8970: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8980: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8990: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
89a0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
89b0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
89c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
89d0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
89e0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
89f0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8a00: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8a10: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8a20: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8a30: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8a40: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8a50: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8a60: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8a70: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8a80: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8a90: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
8aa0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
8ab0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
8ac0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
8ad0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8ae0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8af0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8b00: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8b10: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8b20: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8b30: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8b50: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8b60: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8b70: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8b80: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
8b90: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8ba0: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
8bb0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8bc0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
8bd0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
8be0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8bf0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8c00: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8c10: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8c20: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8c30: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8c40: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8c50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8c60: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8c70: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8c80: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8c90: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8ca0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8cb0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8cc0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8cd0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
8ce0: 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64  &pInfo->pPayload
8cf0: 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20  [pInfo->nLocal] 
8d00: 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a  - pCell) + 4;.}.
8d10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8d20: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8d30: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8d40: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8d50: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8d60: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8d70: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8d80: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8d90: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8da0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8db0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8dc0: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
8dd0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8de0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
8df0: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
8e00: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
8e10: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
8e20: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
8e30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8e40: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
8e50: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
8e60: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
8e70: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
8e80: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
8e90: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
8ea0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
8eb0: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
8ec0: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
8ed0: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
8ee0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
8ef0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
8f00: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8f10: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
8f20: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
8f30: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8f40: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8f50: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8f60: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8f80: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8f90: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8fa0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8fb0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8fc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8fd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
8fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8ff0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9000: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9010: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
9020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9030: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
9040: 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =4 );.#ifndef SQ
9050: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9060: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
9070: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  age);.#endif.  p
9080: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
9090: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
90a0: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
90b0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
90c0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
90d0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
90e0: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
90f0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >pPayload = 0;. 
9100: 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69   return;.}.stati
9110: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
9120: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
9130: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9140: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9150: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9160: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9190: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
91a0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
91b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
91c0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
91d0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
91e0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
91f0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9200: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9210: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9220: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9240: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9250: 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20  /.  u64 iKey;   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9270: 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c  xtracted Key val
9280: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
9290: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
92a0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
92b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
92c0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
92d0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
92e0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
92f0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
9300: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
9310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9320: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
9330: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
9340: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9350: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9360: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9370: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9380: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
9390: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
93a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
93b0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
93c0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
93d0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
93e0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
93f0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9400: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9410: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9420: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9430: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9440: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9450: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9460: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9470: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9480: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
9490: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
94a0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
94b0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
94c0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
94d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
94e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
94f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9500: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
9510: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
9520: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9530: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9540: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9550: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
9560: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9570: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
9580: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9590: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
95a0: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
95b0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
95c0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
95d0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
95e0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
95f0: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
9600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
9610: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
9620: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
9630: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
9640: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
9650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9660: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9670: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9680: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
9690: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
96a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
96b0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96c0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
96d0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
96e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
96f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9700: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9710: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9720: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9730: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9740: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9750: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9760: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9770: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9780: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9790: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
97a0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
97b0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
97c0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
97d0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
97e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
97f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9800: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9810: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9820: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9830: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9850: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9860: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9870: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9880: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9890: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
98a0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
98b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
98c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
98d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
98e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
98f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9910: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9920: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9930: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9940: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9950: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9960: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
9970: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
9980: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
9990: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
99a0: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
99b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
99c0: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
99d0: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
99e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
99f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9a00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9a10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9a20: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9a30: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9a40: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9a50: 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70  eyLeaf==0 );.  p
9a60: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a70: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a80: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9a90: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9aa0: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9ab0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9ac0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ad0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9ae0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9af0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9b00: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9b10: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9b20: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9b30: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9b40: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9b50: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9b60: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9b70: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9b80: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9b90: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9ba0: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9bb0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9bc0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9bd0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9be0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9bf0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9c00: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9c10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9c20: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9c30: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9c40: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9c50: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9c60: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9c70: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9c80: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9c90: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9ca0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9cb0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9cc0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9cd0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9ce0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9d00: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9d10: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9d20: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9d30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9d40: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9d50: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9d60: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9d70: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9d80: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9d90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9da0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9db0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9dc0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9de0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
9df0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
9e00: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
9e10: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9e20: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9e30: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9e40: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
9e50: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
9e60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9e70: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9e80: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9e90: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9eb0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
9ec0: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
9ed0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
9ee0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
9ef0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
9f00: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
9f10: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9f20: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
9f30: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
9f40: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
9f50: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
9f60: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
9f70: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
9f80: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
9f90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
9fa0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
9fb0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
9fc0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
9fd0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
9fe0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
9ff0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
a000: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a010: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a020: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a030: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a040: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a050: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a060: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a070: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a080: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a090: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a0a0: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a0b0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0c0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0d0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a100: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a110: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a150: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a170: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a180: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a190: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a1a0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a1b0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a1c0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a1d0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a1e0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a1f0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a200: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a210: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a220: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a230: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a240: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a250: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a260: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a270: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a280: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a290: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a2a0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a2b0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a2c0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a2d0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
a2e0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
a2f0: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
a300: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a310: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a320: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a330: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a340: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a350: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a360: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a370: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a380: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a390: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a3a0: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a3b0: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a3c0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a3d0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a3e0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a3f0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a400: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a410: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a420: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a430: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a440: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a450: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a460: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a470: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a480: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a490: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a4a0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a4b0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a4d0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a4e0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a4f0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a500: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a510: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a520: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a530: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a540: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a550: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a560: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a570: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a590: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a5a0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a5b0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a5c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a5d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a5e0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a5f0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a600: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a610: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a620: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a630: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a640: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a650: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a660: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a670: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a680: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a690: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a6a0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a6b0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a6c0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a6d0: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a6e0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a6f0: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a700: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a710: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a720: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a730: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a740: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a750: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a770: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a780: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a790: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a7a0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a7c0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a7d0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a7e0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a7f0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a800: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a810: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a820: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a830: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a840: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a850: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a860: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a870: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a880: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a890: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a8a0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a8b0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a8c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a8d0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a8e0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a8f0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
a900: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
a910: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a920: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a930: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
a940: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
a950: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
a960: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a970: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
a980: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
a990: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
a9a0: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
a9b0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
a9c0: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
a9d0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
a9e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a9f0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
aa00: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
aa10: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
aa20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
aa30: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
aa40: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
aa50: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
aa60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
aa70: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
aa80: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
aa90: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
aaa0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
aab0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
aac0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aad0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
aae0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
aaf0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
ab00: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
ab10: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
ab20: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
ab30: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
ab40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
ab50: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
ab60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab80: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
ab90: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
aba0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
abb0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
abc0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
abd0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
abe0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
abf0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
ac00: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac10: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ac20: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
ac30: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
ac40: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
ac50: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
ac60: 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b  [info.nSize-4]);
ac70: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
ac80: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
ac90: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
aca0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
acb0: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
acc0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
acd0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
ace0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
acf0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
ad00: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
ad10: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
ad20: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
ad30: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
ad40: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
ad50: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
ad60: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
ad70: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
ad80: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
ad90: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ada0: 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ea..**.** EVIDEN
adb0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
adc0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
add0: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
ade0: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
adf0: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
ae00: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
ae10: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
ae20: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
ae30: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
ae40: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
ae50: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
ae60: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
ae70: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
ae80: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
ae90: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
aea0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
aec0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
aed0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
aee0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
aef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
af00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
af10: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
af20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
af30: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
af40: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
af50: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
af60: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af70: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
af80: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
af90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
afa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
afb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
afc0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
afd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
afe0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
aff0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
b000: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
b010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b020: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b030: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
b040: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b060: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b070: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
b0b0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
b0c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b0d0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
b0e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
b0f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b100: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
b110: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
b120: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
b130: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b140: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
b150: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
b160: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
b170: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
b180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
b190: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
b1a0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
b1b0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
b1c0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
b1d0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b1e0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
b1f0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
b200: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
b210: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b220: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
b230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b240: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b250: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
b260: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
b270: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b280: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
b290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b2a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b2b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b2c0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20  );.  temp = 0;. 
b2d0: 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50   src = data = pP
b2e0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
b2f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b300: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
b310: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
b320: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
b330: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
b340: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
b350: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
b360: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
b370: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
b380: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b390: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
b3a0: 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69  eSize;.  iCellFi
b3b0: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b3c0: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43   + 2*nCell;.  iC
b3d0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b3e0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28  Size - 4;.  for(
b3f0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
b400: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
b410: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
b420: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
b430: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
b440: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
b450: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
b460: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
b470: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b480: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b4a0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
b4b0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f  .    /* These co
b4c0: 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  nditions have al
b4d0: 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66  ready been verif
b4e0: 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74  ied in btreeInit
b4f0: 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66  Page().    ** if
b500: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
b510: 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20  e_check=ON..    
b520: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
b530: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
b540: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
b550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b560: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b570: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
b580: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
b590: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
b5a0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
b5b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
b5c0: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
b5d0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
b5e0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
b5f0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
b600: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
b610: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b620: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b630: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b640: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
b650: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
b660: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
b670: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
b680: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
b690: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
b6a0: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
b6b0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
b6c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
b6d0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20  ddr, cbrk);.    
b6e0: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20  if( temp==0 ){. 
b6f0: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
b700: 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29    if( cbrk==pc )
b710: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b720: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
b730: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
b740: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
b750: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  );.      x = get
b760: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b770: 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  5]);.      memcp
b780: 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74  y(&temp[x], &dat
b790: 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65  a[x], (cbrk+size
b7a0: 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72  ) - x);.      sr
b7b0: 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a  c = temp;.    }.
b7c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b7d0: 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d  [cbrk], &src[pc]
b7e0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61  , size);.  }.  a
b7f0: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65  ssert( cbrk>=iCe
b800: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74  llFirst );.  put
b810: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b820: 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74  5], cbrk);.  dat
b830: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
b840: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
b850: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
b860: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
b870: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
b880: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
b890: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
b8a0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
b8b0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b8c0: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
b8d0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
b8e0: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
b8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
b920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b930: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
b940: 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70  e-list on page p
b950: 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20  Pg for space to 
b960: 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79  store a cell nBy
b970: 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73  te bytes in.** s
b980: 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20  ize. If one can 
b990: 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
b9a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b9b0: 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f  e space and remo
b9c0: 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  ve it.** from th
b9d0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
b9e0: 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
b9f0: 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66  e space can be f
ba00: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65  ound on the free
ba10: 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55  -list, return NU
ba20: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  LL..**.** This f
ba30: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65  unction may dete
ba40: 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  ct corruption wi
ba50: 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f  thin pPg.  If co
ba60: 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64  rruption is.** d
ba70: 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52  etected then *pR
ba80: 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  c is set to SQLI
ba90: 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e  TE_CORRUPT and N
baa0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bab0: 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20  .**.** Slots on 
bac0: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68  the free list th
bad0: 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31  at are between 1
bae0: 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72   and 3 bytes lar
baf0: 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a  ger than nByte.*
bb00: 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  * will be ignore
bb10: 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20  d if adding the 
bb20: 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74  extra space to t
bb30: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
bb40: 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73   count.** causes
bb50: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69   the fragmentati
bb60: 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65  on count to exce
bb70: 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  ed 60..*/.static
bb80: 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f   u8 *pageFindSlo
bb90: 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20  t(MemPage *pPg, 
bba0: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
bbb0: 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  pRc){.  const in
bbc0: 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
bbd0: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63  Offset;.  u8 * c
bbe0: 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
bbf0: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->aData;.  int i
bc00: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  Addr = hdr + 1;.
bc10: 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62    int pc = get2b
bc20: 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72  yte(&aData[iAddr
bc30: 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69  ]);.  int x;.  i
bc40: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
bc50: 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
bc60: 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
bc70: 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20   pc>0 );.  do{. 
bc80: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bca0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
bcb0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   */.    /* EVIDE
bcc0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d  NCE-OF: R-06866-
bcd0: 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73  39125 Freeblocks
bce0: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e   are always conn
bcf0: 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f  ected in order o
bd00: 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73  f.    ** increas
bd10: 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20  ing offset. */. 
bd20: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
bd30: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64  Size-4 || pc<iAd
bd40: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70  dr+4 ){.      *p
bd50: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
bd60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bd80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bd90: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
bda0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
bdb0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
bdc0: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
bdd0: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
bde0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
bdf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
be00: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
be10: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
be20: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
be30: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
be40: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
be50: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
be60: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
be70: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
be80: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
be90: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
bea0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
beb0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
bec0: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
bed0: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
bee0: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
bef0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
bf00: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
bf10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bf20: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
bf30: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
bf40: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
bf50: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bf60: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
bf70: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
bf80: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
bf90: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
bfa0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
bfb0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
bfc0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
bfd0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
bfe0: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
bff0: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
c000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
c010: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
c020: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
c030: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
c040: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
c050: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
c060: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c070: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
c080: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
c090: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
c0a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
c0b0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
c0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c0d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
c0e0: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
c0f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
c100: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
c110: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
c120: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
c130: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
c140: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
c150: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
c160: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
c170: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
c180: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
c190: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
c1a0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
c1b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c1c0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
c1d0: 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a    }while( pc );.
c1e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c1f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
c200: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
c210: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
c220: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
c230: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
c240: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
c250: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
c260: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
c270: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
c280: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
c290: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
c2a0: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
c2b0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
c2c0: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
c2d0: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
c2e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
c2f0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
c300: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
c310: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
c320: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
c330: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
c340: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
c350: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
c360: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
c370: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
c380: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
c390: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
c3a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c3b0: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
c3c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
c3d0: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
c3e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
c3f0: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
c400: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
c410: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
c420: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
c430: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
c440: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
c450: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
c460: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
c470: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
c480: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
c490: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
c4a0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
c4b0: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
c4c0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c4d0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c4e0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
c4f0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
c500: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
c510: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
c520: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
c530: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c540: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
c550: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c580: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
c590: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
c5a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5b0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c5c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
c5d0: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
c5e0: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
c5f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c600: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
c610: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
c620: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
c630: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
c640: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c650: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c660: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
c670: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
c680: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c690: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c6a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c6b0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
c6c0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
c6d0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
c6e0: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
c6f0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
c700: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
c710: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
c720: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
c730: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
c740: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
c750: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
c760: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c770: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
c780: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
c790: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
c7a0: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
c7b0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
c7c0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
c7d0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
c7e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
c7f0: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
c800: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
c810: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
c820: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
c830: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
c840: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
c850: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
c860: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
c870: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
c880: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
c890: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
c8a0: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
c8b0: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
c8c0: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
c8d0: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
c8e0: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
c8f0: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
c900: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
c910: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
c920: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
c930: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
c940: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
c950: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
c960: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
c970: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c980: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
c990: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
c9a0: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
c9b0: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
c9c0: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
c9d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c9e0: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
c9f0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
ca00: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
ca10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ca30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ca40: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
ca50: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
ca60: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
ca70: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
ca80: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
ca90: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
caa0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
cab0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
cac0: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
cad0: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
cae0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
caf0: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
cb00: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
cb10: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
cb20: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cb30: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
cb40: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
cb50: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
cb60: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
cb70: 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c  ( (data[hdr+2] |
cb80: 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26  | data[hdr+1]) &
cb90: 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  & gap+2<=top ){.
cba0: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
cbb0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
cbc0: 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  age, nByte, &rc)
cbd0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
cbe0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cbf0: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
cc00: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
cc10: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
cc20: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
cc30: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
cc40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cc50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
cc60: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cc70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cc80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
cc90: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
cca0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
ccb0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
ccc0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
ccd0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
cce0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
ccf0: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
cd00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
cd10: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
cd20: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
cd30: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >top ){.    asse
cd40: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
cd50: 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  >0 || CORRUPT_DB
cd60: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
cd70: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
cd80: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
cd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cda0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
cdb0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
cdc0: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
cdd0: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
cde0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
cdf0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
ce00: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
ce10: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
ce20: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ce30: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ce40: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ce50: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ce60: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ce70: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
ce80: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
ce90: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
cea0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
ceb0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
cec0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
ced0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
cee0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
cef0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
cf00: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
cf10: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
cf20: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
cf30: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
cf40: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
cf50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cf60: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
cf70: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
cf80: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
cf90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cfa0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
cfb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cfc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
cfd0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
cfe0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
cff0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
d000: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
d010: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
d020: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
d030: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
d040: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
d050: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
d060: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
d070: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
d080: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
d090: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
d0a0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
d0b0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
d0c0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
d0d0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
d0e0: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
d0f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
d100: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
d110: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
d120: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
d130: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
d140: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
d150: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
d160: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
d170: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
d180: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
d190: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
d1a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
d1b0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
d1c0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
d1d0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d1f0: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
d200: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
d210: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
d220: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
d230: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
d240: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
d250: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d280: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
d290: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
d2a0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
d2d0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
d2e0: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d310: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
d320: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
d330: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
d360: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
d370: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
d380: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
d3b0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
d3c0: 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67  u32 iLast = pPag
d3d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d3e0: 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74  ze-4; /* Largest
d3f0: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
d400: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
d410: 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
d420: 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
d430: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
d440: 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
d450: 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
d460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
d470: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d480: 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
d490: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
d4a0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
d4b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d4c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d4d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d4e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d4f0: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
d500: 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
d510: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
d520: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
d540: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
d550: 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
d560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d580: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d590: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
d5b0: 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
d5c0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d5d0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d5e0: 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b  iStart<=iLast );
d5f0: 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  ..  /* Overwrite
d600: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
d610: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
d620: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
d630: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69  delete.  ** opti
d640: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
d650: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
d660: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
d670: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
d680: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
d690: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
d6a0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
d6b0: 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
d6c0: 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
d6d0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
d6e0: 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
d6f0: 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
d700: 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
d710: 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
d720: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
d730: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d740: 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
d750: 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
d760: 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
d770: 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
d780: 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
d790: 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
d7a0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
d7b0: 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
d7c0: 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
d7d0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
d7e0: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
d7f0: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
d800: 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b  ))>0 && iFreeBlk
d810: 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  <iStart ){.     
d820: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50   if( iFreeBlk<iP
d830: 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51  tr+4 ) return SQ
d840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d850: 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20  T;.      iPtr = 
d860: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
d870: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d880: 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20  >iLast ) return 
d890: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d8a0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d8b0: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
d8c0: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
d8d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
d8e0: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
d8f0: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
d900: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
d910: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
d920: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
d930: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
d940: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
d950: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
d960: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
d970: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
d980: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
d990: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
d9a0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
d9b0: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
d9c0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
d9d0: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
d9e0: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
d9f0: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
da00: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
da10: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
da20: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
da30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
da40: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
da50: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
da60: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
da70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
da80: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
da90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  ->usableSize ) r
daa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dab0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
dac0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
dad0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
dae0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
daf0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
db00: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
db10: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
db20: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
db30: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
db40: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
db50: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
db60: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
db70: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
db80: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
db90: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
dba0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
dbb0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
dbc0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
dbd0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
dbe0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
dbf0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
dc00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
dc10: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
dc20: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
dc30: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
dc40: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
dc50: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dc70: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
dc80: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
dc90: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
dca0: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
dcb0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
dcc0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
dcd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
dce0: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
dcf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dd00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dd10: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
dd20: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
dd30: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
dd40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
dd50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
dd60: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
dd70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
dd80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
dd90: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
dda0: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
ddb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ddc0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
ddd0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
dde0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
ddf0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
de00: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
de20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
de30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
de40: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
de50: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
de60: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
de70: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
de80: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
de90: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
dea0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
deb0: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
dec0: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ded0: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
dee0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
def0: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
df00: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
df10: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
df20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
df30: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
df40: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
df50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
df60: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
df70: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
df80: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
df90: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
dfa0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
dfb0: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
dfc0: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
dfd0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
dfe0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
dff0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
e000: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
e010: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
e020: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
e030: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
e040: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
e050: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
e060: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
e070: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e080: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
e090: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
e0a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
e0b0: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
e0c0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e0d0: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
e0e0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e0f0: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
e100: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
e110: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
e120: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
e130: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
e140: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
e150: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
e160: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
e170: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
e180: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
e190: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e1a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e1b0: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
e1c0: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
e1d0: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
e1e0: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
e1f0: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
e200: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
e210: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
e220: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
e230: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
e240: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e250: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
e260: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e270: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
e280: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
e290: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
e2a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e2b0: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
e2c0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
e2d0: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
e2e0: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
e2f0: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
e300: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e320: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e330: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e340: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e350: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
e360: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
e370: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
e380: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
e390: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
e3a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e3b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e3c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e3d0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e3e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e3f0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e400: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e410: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e420: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e430: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e440: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e450: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
e460: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
e470: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e480: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e490: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e4a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e4b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e4c0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e4d0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e4e0: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e4f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e500: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e510: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e520: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e530: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e540: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e550: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e570: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
e580: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
e590: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e5a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
e5b0: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
e5c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e5d0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e5e0: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e5f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e600: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
e610: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
e620: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
e630: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
e640: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
e650: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e660: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e670: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e680: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e690: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e6a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e6b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e6c0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e6d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
e6e0: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
e6f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
e700: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
e710: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e720: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
e730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
e740: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
e750: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
e760: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
e770: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
e780: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
e790: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
e7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e7b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
e7c0: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
e7d0: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
e7e0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
e7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e800: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
e810: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
e820: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
e830: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
e840: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
e850: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e860: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
e870: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
e880: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
e890: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
e8a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
e8b0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
e8c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
e8d0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
e8e0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
e8f0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
e900: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
e910: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
e920: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
e930: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
e940: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
e950: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
e960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e970: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
e980: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
e990: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e9a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
e9b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
e9c0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e9d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e9e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e9f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
ea00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
ea10: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
ea20: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
ea30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
ea40: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
ea50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ea60: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ea70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ea80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ea90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
eaa0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
eab0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
eac0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ead0: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
eae0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
eaf0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
eb00: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
eb10: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
eb20: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
eb30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
eb40: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
eb50: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
eb60: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
eb70: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
eb80: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
eb90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
eba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ebb0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ebc0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
ebd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ebe0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ebf0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ec00: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
ec10: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ec20: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ec30: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ec40: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ec50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ec60: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ec70: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ec80: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ec90: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
eca0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ecb0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ecc0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ecd0: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ece0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
ecf0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
ed00: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ed10: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
ed20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
ed30: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
ed40: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ed50: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ed60: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
ed70: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
ed80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ed90: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
eda0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
edb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
edc0: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
edd0: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
ede0: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
edf0: 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
ee00: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
ee10: 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ype. */.    if( 
ee20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
ee30: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
ee40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ee50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ee60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
ee70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
ee80: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
ee90: 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  36 );.    pPage-
eea0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
eeb0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
eec0: 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  - 1);.    pPage-
eed0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
eee0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
eef0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ef00: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
ef10: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
ef20: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  fset = hdr + 8 +
ef30: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
ef40: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ef50: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
ef60: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
ef70: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
ef80: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
ef90: 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67  ffset];.    pPag
efa0: 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
efb0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
efc0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f  dPtrSize];.    /
efd0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
efe0: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
eff0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f000: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
f010: 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20  signates.    ** 
f020: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f030: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f040: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f050: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f060: 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65  r is.    ** inte
f070: 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
f080: 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67  . */.    top = g
f090: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f0a0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f0b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f0c0: 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
f0d0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f0e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
f0f0: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f100: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
f110: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
f120: 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  /.    pPage->nCe
f130: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
f140: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
f150: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
f160: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
f170: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
f180: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
f190: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
f1a0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
f1b0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
f1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f1d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f1e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f1f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
f200: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20  CELL(pBt) );.   
f210: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f220: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
f230: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
f240: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
f250: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  h is only.    **
f260: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
f270: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
f280: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
f290: 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
f2a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73   the.    ** offs
f2b0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
f2c0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
f2d0: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
f2e0: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
f2f0: 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72     ** bytes of r
f300: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
f310: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
f320: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
f330: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
f340: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
f350: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
f360: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f370: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
f380: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
f390: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
f3a0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
f3b0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
f3c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
f3d0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
f3e0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
f3f0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
f400: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
f410: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
f420: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
f430: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
f440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
f450: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
f460: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
f470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
f480: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
f490: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f4a0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
f4b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
f4c0: 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42   - 4;.    if( pB
f4d0: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
f4e0: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
f4f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
f500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f510: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
f520: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f530: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
f540: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
f550: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
f560: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
f570: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f580: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
f590: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
f5a0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f5b0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
f5c0: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
f5d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
f5e0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f5f0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
f600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
f610: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f620: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
f630: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f640: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f650: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
f660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f670: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f680: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
f690: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
f6a0: 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
f6b0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
f6c0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
f6d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f6e0: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
f6f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f720: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f740: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f750: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
f760: 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }  ..    /* Comp
f770: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
f780: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
f790: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
f7a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
f7b0: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
f7c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f7d0: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
f7e0: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
f7f0: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
f800: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
f810: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
f820: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
f830: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
f840: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
f850: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f860: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
f870: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
f880: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
f890: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
f8a0: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
f8b0: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  /.    while( pc>
f8c0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
f8d0: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
f8e0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f8f0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f900: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
f910: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f920: 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61  55530-52930 In a
f930: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
f940: 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20  ree page, there 
f950: 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  will.        ** 
f960: 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61  always be at lea
f970: 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f  st one cell befo
f980: 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65  re the first fre
f990: 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  eblock..        
f9a0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 72  **.        ** Or
f9b0: 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  , the freeblock 
f9c0: 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  is off the end o
f9d0: 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  f the page.     
f9e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
f9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fa00: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
fa10: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
fa20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
fa30: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
fa40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
fa50: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
fa60: 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65  f( (next>0 && ne
fa70: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c  xt<=pc+size+3) |
fa80: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
fa90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
faa0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
fab0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
fac0: 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74  ing order. And t
fad0: 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
fae0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
faf0: 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c  ree-block must l
fb00: 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ie on the databa
fb10: 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  se page.  */.   
fb20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fb30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fb40: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
fb50: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
fb60: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
fb70: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
fb80: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fb90: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
fba0: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
fbb0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
fbc0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
fbd0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
fbe0: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
fbf0: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
fc00: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
fc10: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
fc20: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
fc30: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
fc40: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
fc50: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
fc60: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
fc70: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
fc80: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
fc90: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
fca0: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
fcb0: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
fcc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
fcd0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
fce0: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
fcf0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
fd00: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
fd10: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
fd20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
fd30: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
fd40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fd50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fd60: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
fd70: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
fd80: 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
fd90: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50  llFirst);.    pP
fda0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
fdb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fdc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fdd0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
fde0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
fdf0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
fe00: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
fe10: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
fe20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe30: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
fe40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
fe50: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
fe60: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
fe70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
fe80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
fe90: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
fea0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
feb0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
fec0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
fed0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fee0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fef0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
ff00: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
ff10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
ff20: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ff30: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
ff40: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
ff50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ff60: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ff70: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
ff80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff90: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
ffa0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
ffb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
ffc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ffd0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ffe0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
fff0: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
10000 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
10010 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
10020 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
10030 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
10040 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
10050 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
10060 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
10070 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
10080 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
10090 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
100a0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
100b0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
100c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
100d0 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
100e0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
100f0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
10100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10110 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
10120 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
10130 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
10140 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
10150 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
10160 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
10170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
10180 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
10190 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
101a0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
101b0 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
101c0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
101d0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
101e0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
101f0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
10200 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
10210 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
10220 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
10230 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
10240 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
10250 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
10260 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
10270 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
10280 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
10290 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
102a0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
102b0 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
102c0 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
102d0 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
102e0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
102f0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
10300 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
10310 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
10320 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
10330 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
10340 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
10350 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
10360 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
10370 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
10380 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
10390 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
103a0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
103b0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
103c0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
103d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
103e0 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
103f0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
10400 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
10410 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10420 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
10430 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10440 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
10450 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10460 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
10470 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
10480 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
10490 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
104a0 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
104b0 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
104c0 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
104d0 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
104e0 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
104f0 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
10500 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
10510 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10520 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
10530 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
10540 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
10550 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
10560 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
10570 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
10580 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
10590 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
105a0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
105b0 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
105c0 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
105d0 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
105e0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
105f0 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
10600 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
10610 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
10620 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
10630 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
10640 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
10650 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
10660 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
10670 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
10680 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
10690 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
106a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
106b0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
106c0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
106d0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
106e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
106f0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
10700 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10710 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
10720 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
10730 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
10740 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
10750 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
10760 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
10770 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
10780 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
10790 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
107a0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
107b0 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
107c0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
107d0 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
107e0 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
107f0 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
10800 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10810 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10820 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
10830 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
10840 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
10850 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
10860 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
10870 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10880 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
10890 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
108a0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
108b0 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
108c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
108d0 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
108e0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
108f0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
10900 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
10910 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
10920 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
10930 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
10940 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
10950 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10960 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10970 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10980 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
10990 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
109a0 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
109b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
109c0 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
109d0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
109e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
109f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10a00 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
10a10 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
10a20 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
10a30 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
10a40 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
10a50 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
10a60 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
10a70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
10a80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
10aa0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
10ab0 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
10ac0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
10ad0 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
10ae0 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
10af0 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
10b00 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
10b10 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
10b20 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10b30 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
10b40 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
10b50 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
10b60 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
10b70 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
10b80 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
10b90 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
10ba0 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
10bb0 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
10bc0 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
10bd0 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
10be0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
10bf0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10c00 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
10c10 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
10c20 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
10c30 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
10c40 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
10c50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
10c60 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
10c70 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
10c80 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
10c90 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
10ca0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
10cb0 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
10cc0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
10cd0 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
10ce0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
10cf0 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
10d00 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
10d10 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
10d20 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
10d30 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
10d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
10d50 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
10d60 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
10d70 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
10d80 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
10d90 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
10da0 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
10db0 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
10dc0 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
10dd0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10de0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10e00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
10e10 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10e40 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
10e50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10e60 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
10e70 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
10e80 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
10e90 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
10ea0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
10eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10ec0 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
10ed0 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
10ee0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
10ef0 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
10f00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10f10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
10f20 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
10f30 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10f40 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
10f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10f60 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10f70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
10f80 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
10f90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
10fa0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
10fb0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
10fc0 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
10fd0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
10fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10ff0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
11000 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
11010 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
11020 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
11030 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11040 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
11050 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11060 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
11070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11080 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11090 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
110a0 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
110b0 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
110c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
110d0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
110e0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
110f0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11100 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11110 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
11120 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
11130 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
11140 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11150 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11160 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
11170 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
11180 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
111a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
111d0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
111e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
111f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
11200 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
11210 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
11220 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
11230 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
11240 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
11250 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
11260 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
11270 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
11280 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
11290 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
112a0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
112b0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
112c0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
112d0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
112e0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
112f0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
11300 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
11310 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11320 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  KPT;.    release
11330 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
11340 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11350 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11360 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11370 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69  E_OK;..getAndIni
11380 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69  tPage_error:.  i
11390 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e  f( pCur ) pCur->
113a0 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63  iPage--;.  testc
113b0 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
113c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
113d0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
113e0 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
113f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11400 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
11410 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
11420 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
11430 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
11440 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
11450 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
11460 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11470 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
11480 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
11490 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
114a0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
114b0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
114c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
114d0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
114e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
114f0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11500 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11510 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11530 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11540 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
11550 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
11560 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11570 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11580 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11590 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
115a0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
115b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74  ->pDbPage);.}.st
115c0 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
115d0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
115e0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
115f0 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65  ge ) releasePage
11600 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a  NotNull(pPage);.
11610 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  }../*.** Get an 
11620 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a  unused page..**.
11630 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
11640 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74  st like btreeGet
11650 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20  Page() with the 
11660 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  addition:.**.** 
11670 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65    *  If the page
11680 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75   is already in u
11690 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
116a0 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64  r purpose, immed
116b0 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72  iately.**      r
116c0 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65  elease it and re
116d0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
116e0 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a  URRUPT error..**
116f0 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20     *  Make sure 
11700 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20  the isInit flag 
11710 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74  is clear.*/.stat
11720 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55  ic int btreeGetU
11730 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53  nusedPage(.  BtS
11740 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
11750 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
11760 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
11770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11780 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11790 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
117a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
117b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
117c0 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
117d0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
117e0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
117f0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
11800 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
11810 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
11820 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62  .){.  int rc = b
11830 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
11840 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66   pgno, ppPage, f
11850 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
11860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11870 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11880 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
11890 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
118a0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
118b0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
118c0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
118d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
118e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
118f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
11900 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
11910 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
11920 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
11930 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
11940 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44   rc;.}.../*.** D
11950 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
11960 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
11970 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
11980 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
11990 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
119a0 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
119b0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
119c0 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
119d0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
119e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
119f0 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
11a00 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
11a10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
11a20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11a30 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
11a40 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
11a50 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
11a60 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
11a70 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
11a80 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
11a90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11aa0 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
11ab0 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
11ac0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
11ad0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11ae0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
11af0 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
11b00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11b10 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
11b20 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
11b30 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
11b40 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
11b50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11b60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
11b70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
11b80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
11b90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11ba0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
11bb0 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
11bc0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
11bd0 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
11be0 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
11bf0 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
11c00 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
11c10 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
11c20 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
11c30 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
11c40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
11c50 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
11c60 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
11c70 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
11c80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11c90 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
11ca0 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
11cb0 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
11cc0 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
11cd0 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
11ce0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
11cf0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
11d00 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
11d10 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
11d20 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
11d30 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
11d40 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
11d50 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
11d60 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
11d70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
11d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
11d90 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11da0 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
11db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
11dc0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
11dd0 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
11de0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11df0 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
11e00 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
11e10 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
11e20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11e30 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
11e40 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
11e50 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
11e60 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
11e70 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
11e80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
11e90 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11ea0 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
11eb0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
11ec0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11ed0 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
11ee0 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
11ef0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
11f00 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
11f10 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
11f20 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
11f30 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
11f40 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
11f50 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
11f60 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
11f70 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
11f80 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
11f90 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11fa0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
11fb0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
11fc0 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
11fd0 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
11fe0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
11ff0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
12000 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
12010 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
12020 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
12030 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
12040 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
12050 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
12060 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
12070 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
12080 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
12090 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
120a0 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
120b0 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
120c0 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
120d0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
120e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
120f0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
12100 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
12120 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
12130 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
12140 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
12150 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
12160 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
12170 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
12180 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
12190 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
121a0 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
121b0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
121c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
121d0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
121e0 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
121f0 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
12200 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
12210 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
12220 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12230 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
12240 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
12250 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
12260 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12270 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12280 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
12290 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
122a0 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
122b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
122c0 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
122d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
122e0 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
122f0 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
12300 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
12310 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
12320 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
12330 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12340 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
12350 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12360 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12370 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12380 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
12390 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
123a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
123b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
123c0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
123d0 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
123e0 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
123f0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
12400 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
12410 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
12420 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
12430 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
12440 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
12450 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
12460 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
12470 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12480 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
12490 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
124a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
124b0 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
124c0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
124d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
124e0 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
124f0 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
12500 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
12510 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
12520 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
12530 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
12540 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
12550 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
12560 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12570 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
12580 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
12590 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
125a0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
125b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
125c0 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
125d0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
125e0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
125f0 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
12600 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
12610 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
12620 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12630 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
12640 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
12650 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
12660 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12670 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
12680 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12690 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
126a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126b0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
126c0 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
126d0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126f0 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
12700 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
12710 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
12720 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
12730 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
12740 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
12750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12770 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12780 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
12790 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
127a0 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
127b0 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
127c0 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
127d0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
127e0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
127f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
12800 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
12810 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
12820 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
12830 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
12840 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
12850 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
12860 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
12870 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
12880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
12890 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
128a0 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
128b0 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
128c0 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
128d0 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
128e0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
128f0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12900 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
12910 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
12920 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
12930 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
12940 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
12950 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
12960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
12970 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
12980 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
12990 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
129a0 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
129b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
129c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
129d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
129e0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
129f0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
12a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12a10 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
12a20 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
12a30 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
12a40 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
12a50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12a60 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12a70 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12a90 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
12aa0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
12ab0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
12ac0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
12ad0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
12ae0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
12af0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
12b00 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
12b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
12b20 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
12b30 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
12b40 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
12b50 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
12b60 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
12b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12b80 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
12b90 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
12ba0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12bb0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
12bc0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
12bd0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12be0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
12bf0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12c00 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12c10 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12c20 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12c30 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12c40 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12c50 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
12c60 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
12c70 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12c80 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
12c90 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
12ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12cb0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12cc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12cd0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
12ce0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
12cf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
12d00 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
12d10 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12d20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12d30 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12d40 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12d50 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12d60 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12d90 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12da0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12db0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12dd0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
12de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12df0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12e10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12e20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12e30 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12e40 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12e50 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12e60 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12e70 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12e80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12e90 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12ea0 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12eb0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
12ec0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
12ed0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
12ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ef0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
12f00 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
12f10 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12f20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12f30 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12f40 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12f50 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12f70 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12f80 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12f90 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12fa0 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12fb0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
12fc0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
12fd0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
12fe0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
12ff0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
13000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
13010 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
13020 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
13030 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
13040 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
13050 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
13060 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13070 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
13080 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
13090 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
130a0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
130b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
130c0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
130d0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
130e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
130f0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13100 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
13110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13120 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
13150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
13170 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
13180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13190 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
131a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
131b0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
131c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
131d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
131e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
131f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13200 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13210 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13220 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13230 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
13240 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
13250 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
13260 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
13270 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
13280 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
13290 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
132a0 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
132b0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
132c0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
132d0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
132e0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
132f0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
13300 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
13310 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
13320 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
13330 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
13340 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
13350 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
13360 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13370 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
13380 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
13390 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
133a0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
133b0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
133c0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
133d0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
133e0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
133f0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
13400 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
13410 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
13420 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
13430 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
13440 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
13450 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
13460 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
13470 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13480 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
13490 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
134a0 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
134b0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
134c0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
134d0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
134e0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
134f0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
13500 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
13510 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13520 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
13530 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
13540 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
13550 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
13560 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13570 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13580 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13590 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
135a0 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
135b0 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
135e0 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
135f0 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
13600 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
13610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13620 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13630 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
13640 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
13650 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
13660 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
13670 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
13680 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
13690 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
136a0 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
136b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136c0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
136d0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
136e0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
136f0 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
13700 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
13710 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
13720 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
13730 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
13740 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
13750 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
13760 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
13770 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
13780 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
13790 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
137a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
137b0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
137c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
137d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
137e0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
137f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
13800 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
13810 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13820 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
13830 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
13840 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13850 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
13860 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
13870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13880 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
13890 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
138a0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
138b0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
138c0 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
138d0 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
138e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
138f0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
13900 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13910 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
13920 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
13930 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
13940 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
13950 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
13960 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
13970 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
13980 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
13990 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
139a0 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
139b0 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
139c0 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
139d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
139e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
139f0 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
13a00 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
13a10 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
13a20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
13a30 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
13a40 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
13a50 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
13a60 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
13a70 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
13a80 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
13a90 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
13aa0 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
13ab0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
13ac0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
13ad0 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
13ae0 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
13af0 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
13b00 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
13b10 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
13b20 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
13b30 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
13b40 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
13b50 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
13b60 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
13b70 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
13b80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
13b90 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
13ba0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13bb0 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
13bd0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
13be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13bf0 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
13c00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
13c10 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
13c20 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
13c30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
13c40 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
13c50 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
13c60 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
13c70 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
13c80 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
13c90 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
13ca0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
13cb0 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
13cc0 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
13cd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
13ce0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
13cf0 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
13d00 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
13d10 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
13d20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
13d30 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
13d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13d60 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13d70 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13d80 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
13d90 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
13da0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13db0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
13dc0 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
13dd0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
13de0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13df0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
13e00 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
13e10 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
13e20 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
13e30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
13e40 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13e50 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
13e60 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
13e70 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
13e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
13e90 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
13ea0 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
13eb0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
13ec0 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
13ed0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13ee0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13ef0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13f00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
13f10 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
13f20 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
13f30 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
13f40 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
13f50 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
13f60 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
13f70 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
13f80 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
13f90 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13fa0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13fb0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13fc0 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
13fd0 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
13fe0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13ff0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14000 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
14010 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
14020 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
14030 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
14040 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
14050 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
14060 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
14070 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14080 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
14090 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
140a0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
140b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
140c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
140d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
140e0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
140f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14100 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14110 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
14120 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
14130 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
14140 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14150 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14160 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
14170 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14180 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14190 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
141a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
141b0 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
141c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
141d0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
141e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
141f0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
14200 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14210 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
14220 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
14230 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
14240 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
14250 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
14260 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
14270 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
14280 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
14290 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
142a0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
142b0 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
142c0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
142d0 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
142e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
142f0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
14300 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
14310 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
14320 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14330 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
14340 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
14350 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
14360 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14370 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
14380 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
14390 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
143a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
143b0 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
143c0 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
143d0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
143e0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
143f0 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
14400 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
14410 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
14420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14430 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14440 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
14450 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
14460 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
14470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
14480 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
14490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
144a0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
144b0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
144c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
144d0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
144e0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
144f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
14500 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
14510 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
14520 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
14530 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
14540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
14550 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14560 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14570 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
14580 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
14590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
145b0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
145c0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
145d0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
145e0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
145f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14600 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
14610 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
14620 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
14630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
14640 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
14650 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
14660 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
14670 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
14680 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
14690 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
146a0 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
146b0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
146c0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
146d0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
146e0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
146f0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
14700 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
14710 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
14720 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
14730 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14740 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
14750 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
14760 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
14770 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
14780 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
14790 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
147a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
147b0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
147c0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
147d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
147e0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
147f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
14800 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
14810 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
14820 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
14830 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14840 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
14850 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
14860 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
14870 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
14880 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
14890 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
148a0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
148b0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
148c0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
148d0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
148e0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
148f0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
14900 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
14910 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
14920 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
14930 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
14940 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
14950 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
14960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14970 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
14980 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14990 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
149a0 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
149b0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
149c0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
149d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
149e0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
149f0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
14a00 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
14a10 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14a20 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14a30 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
14a40 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
14a50 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
14a60 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
14a70 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
14a80 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
14a90 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14aa0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14ab0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
14ac0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
14ad0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14ae0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
14af0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
14b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
14b10 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
14b20 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14b30 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
14b40 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
14b50 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
14b60 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
14b70 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
14b80 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
14b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14ba0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
14bb0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
14bc0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
14bd0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
14be0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
14bf0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
14c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14c10 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
14c20 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
14c30 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
14c40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14c50 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
14c60 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
14c70 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
14c80 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
14c90 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
14ca0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
14cb0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
14cc0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
14cd0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
14ce0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
14cf0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
14d00 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
14d10 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
14d20 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
14d30 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
14d40 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
14d50 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
14d60 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
14d70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
14d80 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
14d90 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
14da0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
14db0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
14dc0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
14dd0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
14de0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
14df0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
14e00 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
14e10 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
14e20 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
14e30 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
14e40 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
14e50 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
14e60 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
14e70 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
14e80 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
14e90 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
14ea0 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
14eb0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
14ec0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
14ed0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
14ee0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
14ef0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
14f00 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
14f10 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
14f20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
14f30 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
14f40 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
14f50 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
14f60 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
14f70 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
14f80 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
14f90 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
14fa0 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
14fb0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
14fc0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
14fd0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
14fe0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
14ff0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
15000 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
15010 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
15020 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
15030 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
15040 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
15050 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
15060 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
15070 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
15080 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
15090 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
150a0 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
150b0 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
150c0 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
150d0 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
150e0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
150f0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
15100 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
15110 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
15120 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
15130 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
15140 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
15150 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
15160 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15170 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
15180 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
15190 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
151a0 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
151b0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
151c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
151d0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
151e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
151f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15200 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
15210 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
15220 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
15230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
15240 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
15250 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
15260 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
15270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15280 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
15290 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
152a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
152b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
152c0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
152d0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
152e0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
152f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
15300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15310 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15330 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
15340 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
15350 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
15360 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
15370 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
15380 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
15390 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
153a0 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
153b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
153c0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
153d0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
153e0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
153f0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
15400 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
15410 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
15420 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
15430 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
15440 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
15450 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
15460 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
15470 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
15480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
15490 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
154a0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
154b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
154c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
154d0 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
154e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
154f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
15500 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
15510 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
15520 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
15530 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
15540 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
15550 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
15560 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
15570 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
15580 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
15590 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
155a0 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
155b0 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
155c0 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
155d0 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
155e0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
155f0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
15600 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
15610 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
15620 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
15630 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
15640 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
15650 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
15660 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
15670 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
15680 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
15690 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
156a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
156b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
156c0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
156d0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
156e0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
156f0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
15700 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
15710 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15720 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
15730 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
15740 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
15750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15760 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
15770 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15780 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15790 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
157a0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
157b0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
157c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
157d0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
157e0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
157f0 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
15800 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
15810 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
15820 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
15830 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
15840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15850 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
15860 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
15870 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
15880 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
15890 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
158a0 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
158b0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
158c0 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
158d0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
158e0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
158f0 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
15900 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
15910 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
15920 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
15930 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
15940 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
15950 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
15960 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
15970 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
15980 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
15990 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
159a0 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
159b0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
159c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
159d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
159e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
159f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15a00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15a10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
15a30 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
15a40 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
15a50 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
15a60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15a80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
15a90 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
15aa0 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
15ab0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
15ac0 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
15ad0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15ae0 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
15af0 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
15b00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
15b10 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
15b20 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
15b30 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
15b40 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
15b50 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
15b60 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
15b70 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
15b80 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
15b90 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15ba0 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
15bb0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
15bc0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
15bd0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
15be0 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
15bf0 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
15c00 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
15c10 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
15c20 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
15c30 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
15c40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15c50 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
15c60 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
15c70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15c80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
15c90 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
15ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15cb0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15cc0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15cd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
15ce0 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
15cf0 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
15d00 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
15d10 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
15d20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15d30 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
15d40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15d50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
15d60 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
15d70 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
15d80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15d90 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
15da0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
15db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15dc0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
15dd0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
15de0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
15df0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15e00 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15e20 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15e30 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15e40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15e50 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
15e60 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
15e70 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
15e80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15e90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15eb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15ec0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15ed0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
15ee0 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
15ef0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
15f00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
15f10 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
15f20 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
15f30 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
15f40 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
15f50 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
15f60 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
15f70 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
15f80 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
15f90 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
15fa0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
15fb0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
15fc0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
15fd0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
15fe0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
15ff0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
16000 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
16010 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
16020 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
16030 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
16040 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
16050 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
16060 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
16070 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
16080 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
16090 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
160a0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
160b0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
160c0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
160d0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160f0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
16100 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
16110 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
16120 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
16130 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
16140 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
16150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16160 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16170 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16180 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16190 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
161a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
161b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
161c0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
161d0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
161e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
161f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
16200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16210 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16220 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
16230 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
16240 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16250 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
16260 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
16270 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
16280 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
16290 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
162a0 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
162b0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
162c0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
162d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
162e0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
162f0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
16300 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
16310 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
16320 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
16330 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
16340 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
16350 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
16360 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
16370 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
16380 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
16390 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
163a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
163b0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
163c0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
163d0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
163e0 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
163f0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
16400 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
16410 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
16420 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
16430 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
16440 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
16450 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
16460 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
16470 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
16480 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
16490 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
164a0 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
164b0 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
164c0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
164d0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
164e0 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
164f0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
16500 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
16510 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
16520 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
16530 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
16540 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
16550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16560 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
16570 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
16580 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
16590 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
165a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
165b0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
165c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
165d0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
165e0 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
165f0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
16600 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16610 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
16620 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
16630 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
16640 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
16650 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16660 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
16670 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
16680 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16690 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
166a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
166b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
166c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
166d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
166e0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
166f0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
16700 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
16710 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
16720 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16730 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
16740 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
16750 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
16760 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
16770 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
16780 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
16790 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
167a0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
167b0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
167c0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
167d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
167e0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
167f0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
16800 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
16810 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
16820 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
16830 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
16840 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
16850 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
16860 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
16870 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
16880 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
16890 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
168a0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
168b0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
168c0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
168d0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
168e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
168f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16910 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
16920 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
16930 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16940 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
16950 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
16960 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
16970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16980 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
16990 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
169a0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
169b0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
169c0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
169d0 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
169e0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
169f0 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
16a00 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
16a10 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
16a20 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
16a30 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
16a40 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
16a50 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
16a60 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
16a70 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
16a80 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
16a90 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
16aa0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
16ab0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
16ac0 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
16ad0 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
16ae0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
16af0 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
16b00 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
16b10 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
16b20 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
16b30 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
16b40 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
16b50 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
16b60 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
16b70 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
16b80 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16b90 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
16ba0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
16bb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16bc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
16bd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
16be0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
16bf0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
16c00 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
16c10 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
16c20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
16c30 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
16c40 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
16c50 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
16c60 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
16c70 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
16c80 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
16c90 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
16ca0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
16cb0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
16cc0 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
16cd0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
16ce0 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
16cf0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
16d00 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
16d10 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
16d20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
16d30 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
16d40 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
16d50 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
16d60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
16d70 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
16d80 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
16d90 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
16da0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16db0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
16dc0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
16dd0 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
16de0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16df0 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
16e00 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
16e10 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
16e20 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
16e30 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
16e40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16e50 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
16e60 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
16e70 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
16e80 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
16e90 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
16ea0 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
16eb0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
16ec0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
16ed0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
16ee0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
16ef0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
16f00 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
16f10 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
16f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16f30 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
16f40 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
16f50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
16f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16f70 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
16f80 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
16f90 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
16fa0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16fc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16fd0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
16fe0 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
16ff0 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65  ELETE flag if ne
17000 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
17010 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
17020 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
17030 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
17040 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
17050 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53  value of the BTS
17060 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a  _SECURE_DELETE.*
17070 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20  * setting after 
17080 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69  the change..*/.i
17090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
170a0 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
170b0 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
170c0 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
170d0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
170e0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
170f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
17100 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
17110 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
17120 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43  lags &= ~BTS_SEC
17130 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  URE_DELETE;.    
17140 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d  if( newFlag ) p-
17150 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
17160 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
17170 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  ETE;.  } .  b = 
17180 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
17190 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
171a0 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c  ELETE)!=0;.  sql
171b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
171c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
171d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
171e0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
171f0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
17200 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
17210 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
17220 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
17230 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
17240 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
17250 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
17260 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
17270 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
17280 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
17290 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
172a0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
172b0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
172c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
172d0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
172e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
172f0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
17300 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
17310 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
17320 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17330 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
17340 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
17350 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
17360 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17370 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
17380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
17390 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
173a0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
173b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
173c0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
173d0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
173e0 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
173f0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
17400 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
17410 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
17420 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
17430 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
17440 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
17450 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
17460 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
17470 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17480 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17490 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
174a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
174b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
174c0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
174d0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
174e0 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
174f0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
17500 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
17510 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
17520 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
17530 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
17540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17550 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
17560 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
17570 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
17580 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
17590 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
175a0 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
175b0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
175c0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
175d0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
175e0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
175f0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
17600 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
17610 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
17620 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
17630 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17640 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17650 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
17660 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
17670 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
17680 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17690 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
176a0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
176b0 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
176c0 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
176d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
176e0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
176f0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
17700 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
17710 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
17720 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
17730 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
17740 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
17750 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
17760 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17770 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
17780 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
17790 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
177a0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
177b0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
177c0 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
177d0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
177e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
177f0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
17800 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
17810 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
17820 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
17830 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
17840 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
17850 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
17860 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17870 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17880 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
17890 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
178a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
178b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
178c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
178d0 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
178e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
178f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17900 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
17910 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
17920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17930 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
17940 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
17950 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
17960 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
17970 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
17980 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
17990 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
179a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
179b0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
179c0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
179d0 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
179e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
179f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
17a00 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
17a10 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
17a20 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
17a30 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
17a40 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
17a50 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
17a60 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
17a70 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
17a80 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
17a90 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
17aa0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17ab0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
17ac0 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
17ad0 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
17ae0 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
17af0 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
17b00 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
17b10 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
17b20 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
17b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
17b40 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
17b50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
17b60 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
17b70 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
17b80 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
17b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
17ba0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
17bb0 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
17bc0 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
17bd0 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
17be0 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
17bf0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
17c00 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
17c10 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
17c20 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
17c30 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
17c40 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
17c50 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
17c60 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
17c70 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
17c80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17c90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17ca0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
17cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
17cc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
17cd0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
17ce0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17cf0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
17d00 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
17d10 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
17d20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17d30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
17d40 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
17d50 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
17d60 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17d70 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
17d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17d90 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
17da0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
17db0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
17dc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
17dd0 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
17de0 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
17df0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
17e00 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
17e10 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
17e20 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
17e30 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
17e40 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
17e50 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
17e60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
17e70 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
17e80 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
17e90 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
17ea0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
17eb0 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
17ec0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
17ed0 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
17ee0 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
17ef0 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
17f00 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
17f10 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
17f20 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
17f30 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
17f40 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
17f50 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
17f60 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
17f70 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
17f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
17f90 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
17fa0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17fb0 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
17fc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
17fd0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
17fe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
17ff0 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
18000 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
18010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18030 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18040 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
18050 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54 45  else{.#if SQLITE
18060 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
18070 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46  NOUS!=SQLITE_DEF
18080 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
18090 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73 71 6c  NOUS.        sql
180a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20  ite3 *db;.      
180b0 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 20    Db *pDb;.     
180c0 20 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e     if( (db=pBt->
180d0 64 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64  db)!=0 && (pDb=d
180e0 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20  b->aDb)!=0 ){.  
180f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
18100 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44  Db->pBt==0 || pD
18110 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74  b->pBt->pBt!=pBt
18120 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20   ){ pDb++; }.   
18130 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
18140 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20 20 20  bSyncSet==0.    
18150 20 20 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73         && pDb->s
18160 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53 51 4c  afety_level==SQL
18170 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18180 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20 20 20 20  HRONOUS+1.      
18190 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
181a0 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
181b0 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45  evel = SQLITE_DE
181c0 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
181d0 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20 20 20 20  ONOUS+1;.       
181e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
181f0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
18200 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
18210 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
18220 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66  y_level | (db->f
18230 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41  lags & PAGER_FLA
18240 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 20  GS_MASK));.     
18250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18260 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
18270 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
18280 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
18290 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
182a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
182b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
182c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
182d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
182e0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
182f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
18300 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
18310 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
18320 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
18330 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
18340 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
18350 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
18360 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
18370 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
18380 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
18390 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
183a0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
183b0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
183c0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
183d0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
183e0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
183f0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
18400 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
18410 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
18420 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
18430 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
18440 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
18450 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18460 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
18470 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18480 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
18490 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
184a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
184b0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
184c0 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
184d0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
184e0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
184f0 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
18500 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
18510 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
18520 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
18530 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
18540 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
18550 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
18560 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18570 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
18580 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
18590 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
185a0 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
185b0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
185c0 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
185d0 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
185e0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
185f0 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
18600 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
18610 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
18620 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
18630 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
18640 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18650 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
18660 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
18670 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
18680 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18690 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
186a0 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
186b0 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
186c0 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
186d0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
186e0 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
186f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18700 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18710 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
18720 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
18730 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
18740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
18750 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
18760 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
18770 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
18780 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
18790 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
187a0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
187b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
187c0 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
187d0 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
187e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
187f0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
18800 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
18810 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
18820 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
18830 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
18840 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
18850 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
18860 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
18870 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
18880 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
18890 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
188a0 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
188b0 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
188c0 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
188d0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
188e0 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
188f0 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
18900 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
18910 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
18920 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
18930 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
18940 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
18950 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
18960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
18970 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
18980 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
18990 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
189a0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
189b0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
189c0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
189d0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
189e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
189f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
18a00 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
18a10 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
18a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18a30 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
18a40 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
18a50 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18a80 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
18a90 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
18aa0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18ab0 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
18ac0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
18ad0 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
18ae0 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
18af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18b10 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
18b20 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
18b40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
18b50 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
18b60 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
18b70 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
18b80 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
18b90 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
18ba0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
18bb0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
18bc0 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
18bd0 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
18be0 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
18bf0 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
18c00 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
18c10 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
18c20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18c30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18c40 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
18c50 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
18c60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18c70 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
18c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18c90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
18ca0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18cb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
18cc0 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
18cd0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
18ce0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
18cf0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
18d00 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
18d10 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
18d20 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
18d30 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
18d40 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
18d50 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
18d60 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
18d70 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
18d80 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
18d90 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
18da0 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
18db0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
18dc0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
18dd0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
18de0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
18df0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
18e00 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
18e10 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
18e20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
18e30 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
18e40 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
18e50 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
18e60 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
18e70 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
18e80 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
18e90 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18ea0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
18eb0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
18ec0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
18ed0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
18ee0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
18ef0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
18f00 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
18f10 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
18f20 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
18f30 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
18f40 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
18f50 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
18f60 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
18f70 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
18f80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18f90 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
18fa0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
18fb0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
18fc0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
18fd0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
18fe0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
18ff0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
19000 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
19010 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
19020 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19030 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
19040 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
19050 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
19060 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
19070 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
19080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
19090 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
190a0 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
190b0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
190c0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
190d0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
190e0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
190f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
19100 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
19110 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
19120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19130 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
19140 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
19150 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
19160 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
19170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
19180 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
19190 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
191a0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
191b0 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
191c0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
191d0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
191e0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
191f0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
19200 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
19210 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
19220 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
19230 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19240 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
19250 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
19260 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
19270 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
19280 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
19290 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
192a0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
192b0 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
192c0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
192d0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
192e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
192f0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19300 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
19310 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
19320 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
19330 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
19340 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
19350 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
19360 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
19370 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
19380 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
19390 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
193a0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
193b0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
193c0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
193d0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
193e0 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
193f0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
19400 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
19410 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
19420 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
19430 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
19440 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
19450 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
19460 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
19470 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
19480 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
19490 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
194a0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
194b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
194c0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
194d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
194e0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
194f0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
19500 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
19510 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19520 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
19530 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
19540 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
19550 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
19560 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
19570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
19580 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
19590 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
195a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
195b0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
195c0 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
195d0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
195e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
195f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19600 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
19610 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
19620 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
19630 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
19640 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
19650 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19660 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
19670 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
19680 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
19690 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
196a0 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
196b0 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
196c0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
196d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
196e0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
196f0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
19700 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
19710 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
19720 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
19730 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
19740 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
19750 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
19760 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
19770 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
19780 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
19790 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
197a0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
197b0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
197c0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
197d0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
197e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
197f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
19800 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19810 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
19820 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19830 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19840 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19850 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
19860 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
19870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
19880 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
19890 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
198a0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
198b0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
198c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
198d0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
198e0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
198f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
19900 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
19910 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
19920 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
19930 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19940 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
19950 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
19960 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
19970 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
19980 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
19990 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
199a0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
199b0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
199c0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
199d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
199e0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
199f0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
19a00 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
19a10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
19a20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
19a30 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
19a40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
19a50 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
19a60 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
19a70 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
19a80 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
19a90 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
19aa0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
19ab0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
19ac0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
19ad0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
19ae0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19af0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
19b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19b10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19b20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
19b30 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
19b40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
19b50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19b60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
19b70 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
19b80 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
19b90 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19ba0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
19bb0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
19bc0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
19bd0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
19be0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
19bf0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
19c00 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
19c10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19c20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
19c30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
19c40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
19c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
19c60 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
19c70 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
19c80 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19c90 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
19ca0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
19cb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
19cc0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
19cd0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19ce0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
19cf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19d00 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
19d10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
19d20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19d30 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
19d40 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
19d50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
19d60 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
19d70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19d80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19d90 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
19da0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
19db0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
19dc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
19dd0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
19de0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19df0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
19e00 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
19e10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
19e20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
19e30 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
19e40 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
19e50 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19e60 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
19e70 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
19e80 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
19e90 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
19ea0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
19eb0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
19ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
19ed0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
19ee0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
19ef0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
19f00 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
19f10 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
19f20 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
19f30 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
19f40 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
19f50 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
19f60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
19f70 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
19f80 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
19f90 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
19fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19fb0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
19fc0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
19fd0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
19fe0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
19ff0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1a000 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1a010 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1a020 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1a030 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1a040 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1a050 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a060 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1a070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a080 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1a090 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a0a0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1a0b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1a0c0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1a0d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1a0e0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1a0f0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1a100 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1a110 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1a120 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1a130 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1a140 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1a150 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1a160 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1a170 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1a180 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1a190 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1a1a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1a1b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1a1c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1a1d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1a1e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1a1f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1a200 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1a210 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1a220 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1a230 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1a240 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1a250 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1a260 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1a270 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1a280 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1a290 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1a2a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1a2b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1a2c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1a2d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1a2e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1a2f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1a300 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1a310 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1a320 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1a330 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1a340 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1a350 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1a360 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1a370 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1a380 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1a390 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1a3a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1a3b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1a3c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1a3d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1a3e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1a3f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1a400 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1a410 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1a420 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a430 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1a440 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1a450 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1a460 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a470 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a480 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1a490 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a4a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1a4b0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1a4c0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1a4d0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1a4e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1a4f0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1a500 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1a510 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1a520 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1a530 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1a540 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1a550 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1a560 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a570 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1a580 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1a590 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1a5a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1a5b0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1a5c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1a5d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1a5e0 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1a5f0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1a600 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1a610 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1a620 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1a630 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1a640 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1a650 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1a660 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1a670 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1a680 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1a690 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1a6a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1a6b0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1a6c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1a6d0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a  HARED_CACHE.  {.
1a6e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c      sqlite3 *pBl
1a6f0 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  ock = 0;.    /* 
1a700 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
1a710 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
1a720 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
1a730 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a740 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69  n .    ** on thi
1a750 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
1a760 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
1a770 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
1a780 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a  saction is.    *
1a790 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
1a7a0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1a7b0 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  D..    */.    if
1a7c0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1a7d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a7e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1a7f0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
1a800 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
1a810 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  NG)!=0.    ){.  
1a820 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
1a830 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
1a840 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66     }else if( wrf
1a850 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42  lag>1 ){.      B
1a860 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
1a870 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1a880 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1a890 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1a8a0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1a8b0 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1a8c0 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =p ){.          
1a8d0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1a8e0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1a8f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c     }.    if( pBl
1a920 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ock ){.      sql
1a930 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1a940 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
1a950 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
1a960 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1a970 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
1a980 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1a990 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  un;.    }.  }.#e
1a9a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
1a9b0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
1a9c0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
1a9d0 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
1a9e0 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
1a9f0 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
1aa00 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
1aa10 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
1aa20 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
1aa30 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
1aa40 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
1aa50 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
1aa60 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
1aa70 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
1aa80 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1aa90 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
1aaa0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
1aab0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
1aac0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1aad0 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
1aae0 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
1aaf0 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
1ab00 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
1ab10 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1ab20 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
1ab30 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
1ab40 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
1ab50 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
1ab60 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
1ab70 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
1ab80 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
1ab90 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1aba0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1abb0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
1abc0 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
1abd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1abe0 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
1abf0 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
1ac00 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
1ac10 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
1ac20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
1ac30 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1ac40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ac50 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
1ac60 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
1ac70 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1ac80 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
1ac90 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
1aca0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
1acb0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1acc0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1acd0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
1ace0 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
1acf0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
1ad00 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
1ad10 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
1ad20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ad30 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1ad40 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
1ad50 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1ad60 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
1ad70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ad80 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1ad90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ada0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1adb0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
1adc0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
1add0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1ade0 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
1adf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ae10 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1ae20 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
1ae30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ae40 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
1ae50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae60 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1ae70 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1ae80 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
1ae90 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
1aea0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
1aeb0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1aec0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
1aed0 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
1aee0 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
1aef0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1af00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1af10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1af20 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1af30 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1af40 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1af50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1af60 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1af70 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1af80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1af90 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1afa0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1afb0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1afc0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1afd0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1afe0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1aff0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1b000 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1b010 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1b020 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1b030 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1b040 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1b050 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1b060 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1b070 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1b080 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1b090 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1b0a0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1b0b0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1b0c0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1b0d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b0e0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1b0f0 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1b100 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b110 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1b120 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1b130 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1b140 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1b150 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1b160 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1b170 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1b180 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1b190 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1b1a0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1b1b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1b1c0 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1b1d0 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1b1e0 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1b1f0 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1b200 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1b210 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1b220 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1b230 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1b240 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1b250 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1b260 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1b270 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1b280 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1b290 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1b2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1b2b0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1b2c0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1b2d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1b2e0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1b2f0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1b300 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1b310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1b320 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1b330 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1b340 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1b350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b360 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1b370 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1b380 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b3a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b3b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1b3c0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1b3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b3e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
1b3f0 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
1b400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b410 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
1b420 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1b430 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1b440 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1b450 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1b460 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
1b470 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
1b480 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1b490 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b4a0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
1b4b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1b4c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1b4d0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1b4e0 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1b4f0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1b500 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1b510 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b520 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1b530 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
1b540 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1b550 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1b560 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b570 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1b580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b590 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1b5a0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1b5b0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1b5c0 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1b5d0 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1b5e0 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1b5f0 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1b600 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1b610 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1b620 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1b630 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1b640 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1b650 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1b660 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1b670 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1b680 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1b690 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1b6c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1b6d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b6f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1b700 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1b710 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1b740 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1b750 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1b760 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
1b770 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1b780 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
1b790 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1b7a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1b7b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b7c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1b7d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
1b7e0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1b7f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1b810 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
1b820 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
1b830 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1b840 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1b850 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1b860 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1b870 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b880 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1b890 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1b8a0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1b8b0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1b8c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1b8d0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1b8e0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1b8f0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1b900 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1b910 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1b920 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1b930 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1b940 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1b950 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1b960 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b970 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b980 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b990 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1b9a0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1b9b0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1b9c0 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
1b9d0 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
1b9e0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1b9f0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1ba00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ba10 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
1ba20 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
1ba30 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
1ba40 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
1ba50 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
1ba60 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1ba70 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
1ba80 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
1ba90 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
1baa0 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
1bab0 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
1bac0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
1bad0 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
1bae0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1baf0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1bb00 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
1bb10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1bb20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
1bb30 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1bb40 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
1bb50 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1bb60 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1bb70 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
1bb80 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
1bb90 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1bba0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
1bbb0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
1bbc0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
1bbd0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
1bbe0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
1bbf0 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
1bc00 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1bc10 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1bc40 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
1bc50 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
1bc60 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
1bc70 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
1bc80 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
1bc90 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
1bca0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1bcb0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1bcc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1bcd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bce0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1bcf0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1bd00 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
1bd10 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1bd20 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
1bd30 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
1bd40 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
1bd50 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
1bd60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
1bd70 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
1bd80 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1bd90 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1bda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bdb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1bdc0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1bdd0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1bde0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1bdf0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
1be00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
1be10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1be20 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1be30 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1be40 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1be50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1be60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1be70 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1be80 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
1be90 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1bea0 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
1beb0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1bec0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1bed0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1bee0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
1bef0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
1bf00 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70   info;.        p
1bf10 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
1bf20 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1bf30 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
1bf40 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69  f( info.nLocal<i
1bf50 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20  nfo.nPayload.   
1bf60 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
1bf70 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61  nfo.nSize-1<=pPa
1bf80 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1bf90 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
1bfa0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
1bfb0 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1bfc0 2e 6e 53 69 7a 65 2d 34 29 0a 20 20 20 20 20 20  .nSize-4).      
1bfd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
1bfe0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  ut4byte(pCell+in
1bff0 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29  fo.nSize-4, iTo)
1c000 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c010 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c030 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1c040 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1c050 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1c060 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1c070 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c090 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1c0a0 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1c0b0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1c0c0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1c0d0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1c0e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1c0f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1c100 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1c110 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1c120 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c130 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
1c140 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1c150 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c160 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1c170 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
1c180 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1c190 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
1c1a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c1b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1c1c0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1c1d0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1c1e0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1c1f0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1c200 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1c210 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1c220 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1c230 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1c240 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1c250 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1c260 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1c270 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1c280 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1c290 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1c2a0 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1c2b0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1c2c0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1c2d0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1c2e0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1c2f0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1c300 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1c310 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1c320 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1c330 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1c340 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1c350 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1c360 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1c370 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1c380 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1c390 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1c3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1c3b0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1c3c0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1c3d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1c3e0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1c3f0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1c400 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1c410 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1c420 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1c430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1c440 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1c450 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1c460 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1c470 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1c480 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1c490 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1c4a0 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1c4b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1c4c0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1c4d0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1c4e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1c4f0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1c500 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1c510 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1c520 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1c530 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1c540 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1c550 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1c560 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1c570 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1c580 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1c590 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c5a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1c5b0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1c5c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c5d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1c5e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1c5f0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1c600 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1c610 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1c620 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1c630 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1c640 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1c650 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1c660 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1c670 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1c680 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1c690 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1c6a0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1c6b0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1c6c0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1c6d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1c6e0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1c6f0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1c700 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1c710 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1c720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c740 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1c750 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1c760 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1c770 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1c780 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1c790 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1c7a0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1c7b0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1c7c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1c7d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1c7e0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1c7f0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1c800 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1c810 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1c820 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1c830 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1c840 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1c850 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1c860 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1c870 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1c880 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1c890 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1c8a0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1c8b0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1c8c0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1c8d0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1c8e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1c8f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1c900 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1c910 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c920 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1c930 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1c940 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1c950 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1c990 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1c9a0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1c9b0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1c9c0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1c9d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1c9e0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1c9f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1ca00 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1ca10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ca20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ca40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ca50 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1ca60 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1ca70 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1ca80 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1ca90 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1caa0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1cab0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1cac0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1cad0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1cae0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1caf0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1cb00 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1cb10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1cb20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1cb30 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1cb40 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1cb50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cb60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1cb70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1cb80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1cb90 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1cba0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1cbb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1cbc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1cbd0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1cbe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cbf0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1cc00 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1cc10 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1cc20 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1cc30 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1cc40 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1cc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1cc70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1cc80 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1cc90 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1cca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ccb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1ccc0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1ccd0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1cce0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1ccf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1cd00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1cd10 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1cd20 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1cd30 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1cd40 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1cd50 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1cd60 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1cd70 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1cd80 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1cd90 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1cda0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1cdb0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1cdc0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1cdd0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1cde0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1cdf0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1ce00 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1ce10 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1ce20 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1ce30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1ce40 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1ce50 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1ce60 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1ce70 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1ce80 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1ce90 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1cea0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1ceb0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1cec0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1ced0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1cee0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1cef0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1cf00 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1cf10 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1cf20 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1cf30 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1cf40 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1cf50 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1cf60 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1cf70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1cf80 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1cf90 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1cfa0 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1cfb0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1cfc0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1cfd0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1cfe0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1cff0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1d000 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1d010 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1d020 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1d030 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1d040 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1d050 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1d060 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1d070 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1d080 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1d090 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1d0a0 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1d0b0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1d0c0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1d0d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d0e0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1d0f0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1d100 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1d110 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d120 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1d130 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1d140 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1d150 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1d160 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1d170 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1d180 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1d190 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1d1a0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1d1b0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1d1c0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1d1d0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1d1e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1d1f0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1d200 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1d210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d220 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1d230 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1d240 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1d250 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1d260 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1d270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d290 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1d2a0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d2b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d2c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d2d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1d2e0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d2f0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1d300 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1d310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1d320 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1d330 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1d340 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1d350 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1d360 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1d370 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1d380 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1d390 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1d3a0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1d3b0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1d3c0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1d3d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1d3e0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1d3f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1d400 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1d410 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1d420 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1d430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d440 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1d450 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1d460 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1d470 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1d480 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1d490 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1d4a0 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1d4b0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1d4c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d4d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1d500 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1d510 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1d520 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1d530 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1d540 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1d550 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d570 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1d580 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1d590 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1d5a0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1d5b0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1d5c0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1d5d0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1d5e0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1d5f0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1d600 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1d610 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1d620 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1d630 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1d640 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1d650 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1d660 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1d670 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1d680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d6b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d6c0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1d6d0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1d6e0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1d6f0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1d700 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1d710 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1d720 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1d730 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1d740 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1d750 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1d760 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1d770 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1d780 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1d790 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1d7a0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1d7b0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1d7c0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1d7d0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1d7e0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1d7f0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1d800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1d810 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1d820 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1d830 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1d840 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1d850 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1d860 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1d870 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1d880 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1d890 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1d8a0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1d8b0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1d8c0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1d8d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d8f0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1d900 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1d910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d920 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1d930 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1d940 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1d950 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1d960 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1d970 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1d980 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1d990 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1d9a0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1d9b0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1d9c0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1d9d0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1d9e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1d9f0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1da00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1da10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1da20 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1da30 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1da40 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1da50 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1da60 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1da70 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1da80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1da90 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1daa0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1dab0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1dac0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1dad0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1dae0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1daf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1db00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1db10 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1db20 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1db30 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1db40 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1db50 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1db60 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1db70 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1db80 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1db90 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1dba0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1dbb0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1dbc0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1dbd0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1dbe0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1dbf0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1dc00 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1dc10 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1dc20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1dc50 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1dc60 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1dc70 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1dca0 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1dcb0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1dcc0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1dcd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1dce0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1dcf0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1dd00 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1dd10 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1dd20 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1dd30 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1dd40 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1dd50 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1dd60 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1dd70 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1dd80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1dd90 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1dda0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ddb0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1ddc0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1ddd0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1dde0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1ddf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1de00 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1de10 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1de20 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1de30 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1de40 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1de50 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1de60 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1de70 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1de80 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1de90 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1dea0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1deb0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1dec0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1ded0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1dee0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1def0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1df00 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1df10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1df20 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1df30 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1df40 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1df50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1df60 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1df70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1df80 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1df90 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1dfa0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1dfb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1dfc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1dfd0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1dfe0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1dff0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1e000 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1e010 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1e020 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1e030 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1e040 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1e050 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1e060 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1e070 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1e080 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1e090 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1e0a0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e0b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e0c0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1e0d0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1e0e0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1e0f0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1e100 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1e110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e120 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e130 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1e140 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1e150 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1e160 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1e170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e190 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1e1a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1e1b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1e1c0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1e1d0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1e1e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1e1f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e210 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e220 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1e230 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1e240 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e250 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e260 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1e270 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1e290 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1e2a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1e2b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1e2c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e2d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e2e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1e2f0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1e300 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1e310 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1e320 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1e330 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1e340 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1e350 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1e360 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1e370 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1e380 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1e390 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1e3a0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1e3b0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1e3c0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1e3d0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1e3e0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1e3f0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1e400 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1e410 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1e420 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1e430 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1e440 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1e450 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1e460 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1e470 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e480 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1e490 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1e4a0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1e4b0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1e4c0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1e4d0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1e4e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e4f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1e500 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1e510 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1e520 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1e530 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1e540 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1e550 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1e560 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1e570 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e580 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1e590 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1e5a0 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1e5b0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1e5c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e5d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e5e0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1e5f0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1e600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e610 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1e620 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1e630 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1e640 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1e650 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1e660 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1e670 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1e680 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1e690 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1e6a0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1e6b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e6c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1e6d0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1e6e0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1e6f0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1e700 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1e710 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1e720 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1e730 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1e740 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1e750 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1e760 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1e770 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1e780 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1e790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1e7a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e7b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1e7c0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1e7d0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e7e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e7f0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1e800 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1e810 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1e820 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1e830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e840 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e850 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1e860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1e870 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1e880 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1e890 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1e8a0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1e8b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1e8c0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1e8d0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1e8e0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1e8f0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1e900 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1e910 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1e920 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1e930 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1e940 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e950 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1e960 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1e970 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e980 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e990 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1e9a0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1e9b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1e9c0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1e9d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e9e0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1e9f0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1ea00 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1ea10 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1ea20 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1ea30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ea40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ea50 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1ea60 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1ea70 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1ea80 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1ea90 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1eaa0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1eab0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1eac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ead0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1eae0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1eaf0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1eb00 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1eb10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1eb20 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1eb30 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1eb40 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1eb50 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1eb60 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1eb70 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1eb80 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1eb90 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1eba0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1ebb0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1ebc0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1ebd0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1ebe0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1ebf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1ec00 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1ec10 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1ec20 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1ec30 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1ec40 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1ec50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1ec60 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1ec70 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1ec80 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1ec90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1eca0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1ecb0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1ecc0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1ecd0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ece0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1ecf0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1ed00 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1ed10 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1ed20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ed30 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1ed40 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1ed50 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1ed60 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1ed70 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1ed80 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1ed90 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1eda0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1edb0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1edc0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1edd0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1ede0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1edf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1ee00 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1ee10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1ee20 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1ee30 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1ee40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ee50 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1ee60 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1ee70 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1ee80 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1ee90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1eea0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1eeb0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1eec0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1eed0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1eee0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1eef0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1ef00 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1ef10 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1ef20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1ef30 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1ef40 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1ef50 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1ef60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1ef70 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1ef80 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1ef90 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1efa0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1efb0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1efc0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1efd0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1efe0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1eff0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1f000 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1f010 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1f020 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1f030 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1f040 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1f050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1f060 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f070 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1f080 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1f090 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1f0a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f0b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1f0c0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1f0d0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1f0e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1f0f0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1f100 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1f110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f120 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f130 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f140 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1f150 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1f160 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1f170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f180 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f190 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f1a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f1b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1f1c0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1f1d0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1f1e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f1f0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1f200 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1f210 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1f220 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1f230 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f240 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1f250 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1f260 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1f270 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1f280 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f2a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f2b0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1f2c0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1f2d0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1f2e0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1f2f0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1f300 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1f310 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1f320 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1f330 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1f340 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1f350 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1f360 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1f370 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1f380 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1f390 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1f3a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f3b0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1f3c0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1f3d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1f3e0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1f3f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1f400 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1f410 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1f420 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1f430 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1f440 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1f450 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1f460 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1f470 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1f480 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1f490 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1f4a0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1f4b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f4c0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1f4d0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1f4e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1f4f0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1f500 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1f510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1f520 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1f530 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1f540 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1f550 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1f560 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f570 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1f580 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1f590 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f5a0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1f5b0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1f5c0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1f5d0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1f5e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1f5f0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1f600 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1f610 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1f620 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1f630 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1f640 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1f650 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1f660 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1f670 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1f680 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1f690 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1f6a0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1f6b0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1f6c0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1f6d0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f6e0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1f6f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1f700 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1f710 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1f720 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1f730 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1f740 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1f750 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1f760 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1f770 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1f780 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f790 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1f7a0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1f7b0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1f7c0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1f7d0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1f7e0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1f7f0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1f800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f810 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1f820 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1f830 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1f840 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1f850 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f860 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1f870 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1f880 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1f890 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1f8a0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1f8b0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1f8c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f8d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1f8e0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1f8f0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1f900 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1f910 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1f920 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1f930 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1f940 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1f950 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1f960 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1f970 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1f980 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1f990 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1f9a0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1f9b0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1f9c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1f9d0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1f9e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1f9f0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1fa00 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1fa10 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1fa20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1fa30 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1fa40 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1fa50 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1fa60 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1fa70 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1fa80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1fa90 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1faa0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1fab0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1fac0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1fad0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1fae0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1faf0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1fb00 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1fb10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1fb20 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1fb30 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1fb40 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1fb50 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1fb60 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1fb70 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1fb80 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1fb90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1fba0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1fbb0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1fbc0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1fbd0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1fbe0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1fbf0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1fc00 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1fc10 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1fc20 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1fc30 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1fc40 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1fc50 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1fc60 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1fc70 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1fc80 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1fc90 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1fca0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1fcb0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1fcc0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1fcd0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1fce0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1fcf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fd00 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1fd10 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1fd20 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1fd30 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1fd40 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1fd50 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1fd60 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1fd70 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1fd80 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1fd90 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1fda0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1fdb0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1fdc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1fdd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1fde0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1fdf0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1fe00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1fe10 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1fe20 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1fe30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1fe40 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1fe50 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1fe60 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1fe70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1fe80 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1fe90 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1fea0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1feb0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1fec0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1fed0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1fee0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fef0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1ff00 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1ff10 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ff20 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1ff30 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1ff40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1ff50 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1ff60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ff70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1ff80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ff90 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
1ffa0 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
1ffb0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
1ffc0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
1ffd0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
1ffe0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1fff0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20000 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20010 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20020 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20030 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20040 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20050 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20060 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20070 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
20080 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
20090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
200a0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
200b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
200c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
200d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
200e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
200f0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
20100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20110 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20120 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20130 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
20140 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
20150 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20160 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20170 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
20180 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
20190 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
201a0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
201b0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
201c0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
201d0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
201e0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
201f0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
20200 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
20210 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
20220 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
20230 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
20240 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
20250 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
20260 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
20270 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
20280 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
20290 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
202a0 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
202b0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
202c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
202d0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
202e0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
202f0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
20300 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
20310 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
20320 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
20330 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
20340 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
20350 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
20360 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
20370 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
20380 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
20390 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
203a0 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
203b0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
203c0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
203d0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
203e0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
203f0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
20400 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
20410 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
20420 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
20430 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
20440 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
20450 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
20460 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
20470 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
20480 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
20490 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
204a0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
204b0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
204c0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
204d0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
204e0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
204f0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
20500 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
20510 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
20520 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20530 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
20540 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
20550 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
20560 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
20570 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
20580 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
20590 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
205a0 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
205b0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
205c0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
205d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
205e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
205f0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
20600 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
20610 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
20620 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
20630 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
20640 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
20650 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20660 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
20670 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
20680 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
20690 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
206a0 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
206b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
206c0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
206d0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
206e0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
206f0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
20700 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
20710 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20720 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
20730 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
20740 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
20750 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
20760 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
20770 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
20780 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
20790 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
207a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
207b0 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
207c0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65  OR_VALID || p->e
207d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
207e0 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
207f0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
20800 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
20810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20830 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
20840 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69  )sqlite3BtreeTri
20850 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72  pAllCursors(pBtr
20860 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  ee, rc, 0);.    
20870 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20890 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
208a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
208b0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
208c0 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  r(p);.        p-
208d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
208e0 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20  _FAULT;.        
208f0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
20900 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  rCode;.      }. 
20910 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20920 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
20930 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
20940 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
20950 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ]);.        p->a
20960 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
20970 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20980 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20990 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
209a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
209b0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
209c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
209d0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
209e0 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20   If tripCode is 
209f0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68  not SQLITE_OK th
20a00 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  en cursors will 
20a10 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28  be invalidated (
20a20 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c  tripped)..** Onl
20a30 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
20a40 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77  are tripped if w
20a50 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65  riteOnly is true
20a60 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73   but all cursors
20a70 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20   are.** tripped 
20a80 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20a90 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65  false.  Any atte
20aa0 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20  mpt to use.** a 
20ab0 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77  tripped cursor w
20ac0 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
20ad0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
20ae0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
20af0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
20b00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20b10 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
20b20 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
20b30 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
20b40 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
20b50 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
20b60 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
20b70 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
20b80 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74  nt tripCode, int
20b90 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69   writeOnly){.  i
20ba0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
20bb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20bc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
20bd0 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77  e1;..  assert( w
20be0 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77  riteOnly==1 || w
20bf0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  riteOnly==0 );. 
20c00 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64   assert( tripCod
20c10 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  e==SQLITE_ABORT_
20c20 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70  ROLLBACK || trip
20c30 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
20c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20c50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
20c60 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
20c80 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
20c90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
20ca0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
20cb0 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20  c ) writeOnly = 
20cc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20ce0 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
20cf0 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
20d00 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
20d10 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
20d20 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74  , tripCode, writ
20d30 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65  eOnly);.    asse
20d40 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
20d50 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d  K || (writeOnly=
20d60 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54  =0 && rc2==SQLIT
20d70 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28  E_OK) );.    if(
20d80 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20d90 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
20da0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
20db0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
20dc0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20dd0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
20de0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
20df0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
20e00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20e10 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
20e20 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20e30 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
20e40 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20e60 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
20e70 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
20e80 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
20e90 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
20ea0 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
20eb0 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
20ec0 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
20ed0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
20ee0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
20ef0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
20f00 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
20f10 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
20f20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
20f30 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
20f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20f50 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
20f60 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
20f70 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
20f80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20f90 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
20fa0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20fb0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
20fc0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
20fd0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
20fe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
20ff0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
21000 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
21010 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
21020 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21030 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
21040 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
21050 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
21060 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
21070 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21080 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
21090 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
210a0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
210b0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
210c0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
210d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
210e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
210f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
21100 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
21110 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
21120 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
21130 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
21140 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
21150 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
21160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
21170 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
21180 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
21190 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
211a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
211b0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
211c0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
211d0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
211e0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
211f0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
21200 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
21210 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
21220 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
21230 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
21240 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
21250 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
21260 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
21270 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
21280 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
21290 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
212a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
212b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
212c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
212d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
212e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
212f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
21300 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
21310 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
21320 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21330 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
21340 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
21350 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
21360 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
21370 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
21380 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
21390 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
213a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
213b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
213c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
213d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
213e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
213f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
21400 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
21410 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
21420 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
21430 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
21440 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
21450 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
21460 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
21470 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
21480 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
21490 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
214a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
214b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
214c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
214d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
214e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
214f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
21500 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
21510 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
21520 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21530 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21540 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
21550 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
21560 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
21570 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
21580 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
21590 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
215a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
215b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
215c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
215d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
215e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
215f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
21600 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
21610 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
21620 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
21630 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21640 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
21650 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
21660 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
21670 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
21680 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
21690 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
216a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
216b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
216c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
216d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
216e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
216f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
21700 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21710 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
21720 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
21730 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21740 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
21750 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
21760 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
21770 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21790 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
217a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
217b0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
217c0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
217d0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
217e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
217f0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
21800 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
21810 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
21820 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
21830 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
21840 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
21850 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
21860 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
21870 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
21880 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
21890 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
218a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
218b0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
218c0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
218d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
218e0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
218f0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
21900 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
21910 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
21920 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
21930 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
21940 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
21950 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
21960 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
21970 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
21980 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
21990 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
219a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
219b0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
219c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
219d0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
219e0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
219f0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
21a00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21a10 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
21a20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21a30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
21a40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21a50 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
21a60 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
21a70 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
21a80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
21a90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21aa0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
21ab0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
21ac0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
21ad0 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
21ae0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
21af0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
21b00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
21b10 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
21b20 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
21b30 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
21b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21b50 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
21b60 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
21b70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
21b80 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
21b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
21ba0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
21bb0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
21bc0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
21bd0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
21be0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
21bf0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
21c00 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
21c10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
21c20 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
21c30 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
21c40 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
21c50 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
21c60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
21c70 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
21c80 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
21c90 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
21ca0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
21cb0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
21cc0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
21cd0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
21ce0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21cf0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
21d00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21d10 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
21d20 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
21d30 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
21d40 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
21d50 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
21d60 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
21d70 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
21d80 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
21d90 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
21da0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
21db0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
21dc0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
21dd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21de0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
21df0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
21e00 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
21e10 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
21e20 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
21e30 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21e40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21e50 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
21e60 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
21e70 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
21e80 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
21e90 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
21ea0 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
21eb0 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
21ec0 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
21ed0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
21ee0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
21ef0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
21f00 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
21f10 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
21f20 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
21f30 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
21f40 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
21f50 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
21f60 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
21f70 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
21f80 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
21f90 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
21fa0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
21fb0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
21fc0 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
21fd0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
21fe0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
21ff0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
22000 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
22010 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
22020 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
22030 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
22040 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22050 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22060 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22070 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22080 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22090 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
220a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
220b0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
220c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
220d0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
220e0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
220f0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22100 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22110 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22120 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22130 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22140 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
22150 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
22160 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
22170 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
22180 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
22190 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
221a0 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
221b0 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
221c0 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
221d0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
221e0 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
221f0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
22200 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
22210 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
22220 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
22230 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
22240 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
22250 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
22260 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
22270 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
22280 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
22290 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
222a0 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
222b0 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
222c0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
222d0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
222e0 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
222f0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
22300 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
22310 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
22320 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
22330 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
22340 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
22350 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
22360 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
22370 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
22380 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
22390 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
223a0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
223b0 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
223c0 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
223d0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
223e0 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
223f0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
22400 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
22410 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
22420 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
22430 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
22440 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
22450 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
22460 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
22470 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
22480 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
22490 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
224a0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
224b0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
224c0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
224d0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
224e0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
224f0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
22500 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
22510 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
22520 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
22530 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
22540 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
22550 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
22560 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22590 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
225a0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
225d0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
225e0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
22610 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
22620 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
22630 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
22640 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
22650 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22660 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
22670 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
22680 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
226b0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
226c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
226d0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
226f0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
22700 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
22710 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22730 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
22740 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
22750 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
22760 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
22770 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
22780 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
22790 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
227a0 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
227b0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
227c0 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
227d0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
227e0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
227f0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
22800 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
22810 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
22820 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
22830 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
22840 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
22850 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
22860 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
22870 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
22880 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
22890 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
228a0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
228b0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
228c0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
228d0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
228e0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
228f0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
22900 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
22910 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
22920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22930 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
22940 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
22950 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
22960 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
22970 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
22980 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
22990 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
229a0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
229b0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
229c0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
229d0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
229e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
229f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22a00 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
22a10 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
22a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22a30 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
22a40 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
22a50 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22a60 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
22a70 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
22a80 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
22a90 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
22aa0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
22ab0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
22ac0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
22ad0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
22ae0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
22af0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22b00 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
22b10 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
22b20 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
22b30 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
22b40 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
22b50 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
22b60 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
22b70 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
22b80 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
22b90 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
22ba0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
22bb0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
22bc0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
22bd0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
22be0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
22bf0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
22c00 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
22c10 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
22c20 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
22c30 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
22c40 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
22c50 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
22c60 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
22c70 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
22c80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
22c90 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
22ca0 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
22cb0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
22cc0 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
22cd0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
22ce0 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
22cf0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
22d00 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
22d10 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
22d20 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
22d30 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
22d40 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
22d50 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
22d60 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
22d70 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
22d80 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
22d90 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
22da0 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
22db0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
22dc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
22dd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
22de0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
22df0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
22e00 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
22e10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
22e20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22e30 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
22e70 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
22eb0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
22ec0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ef0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22f00 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
22f10 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
22f20 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
22f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22f40 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
22f50 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
22f60 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22f90 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
22fa0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
22fb0 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
22fc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22fd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
22ff0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23000 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
23010 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
23020 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
23030 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
23040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23050 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23070 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23080 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23090 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
230a0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
230b0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
230c0 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
230d0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
230e0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
230f0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23100 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23110 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23120 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23130 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23140 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
23150 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
23160 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
23170 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
23180 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
23190 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
231a0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
231b0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
231c0 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
231d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
231e0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
231f0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
23200 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
23210 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
23220 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
23230 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
23240 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
23250 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
23260 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
23270 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
23280 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
23290 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
232a0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
232b0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
232c0 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
232d0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
232e0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
232f0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
23300 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
23310 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
23320 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
23330 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23340 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
23350 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
23360 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
23370 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
23380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
23390 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
233a0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
233b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
233c0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
233d0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
233e0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
233f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23400 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
23410 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
23420 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
23430 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
23440 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
23450 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
23460 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
23470 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
23480 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
23490 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
234a0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
234b0 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
234c0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
234d0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
234e0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
234f0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
23500 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
23510 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
23520 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
23530 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
23540 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
23550 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
23560 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
23570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
23580 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
23590 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
235a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
235b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
235c0 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
235d0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
235e0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
235f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
23600 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
23610 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
23620 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23630 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
23640 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
23650 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
23660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23670 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
23680 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
23690 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
236a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
236b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
236c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
236d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
236e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
236f0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
23700 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
23710 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
23720 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
23730 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
23740 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
23750 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
23760 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
23770 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
23780 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
23790 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
237a0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
237b0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
237c0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
237d0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
237e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
237f0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
23800 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
23810 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
23820 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
23830 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
23840 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
23850 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
23860 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
23870 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
23880 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
23890 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
238a0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
238b0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
238c0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
238d0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
238e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
238f0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
23900 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
23910 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
23920 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
23930 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
23940 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
23950 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
23960 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
23970 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
23980 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23990 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
239a0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
239b0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
239c0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
239d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
239e0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
239f0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
23a00 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
23a10 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
23a20 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
23a30 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
23a40 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
23a50 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
23a60 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
23a70 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
23a80 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
23a90 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
23aa0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
23ab0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23ac0 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
23ad0 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
23ae0 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
23af0 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
23b00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
23b10 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
23b20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
23b30 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
23b40 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
23b50 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
23b60 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
23b70 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
23b80 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
23b90 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23ba0 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
23bb0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
23bc0 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
23bd0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23be0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
23bf0 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
23c00 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
23c10 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
23c20 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
23c30 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
23c40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23c50 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
23c60 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
23c70 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
23c80 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
23c90 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
23ca0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
23cb0 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
23cc0 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
23cd0 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
23ce0 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
23cf0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
23d00 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
23d10 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
23d20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23d30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23d40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23d60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23d70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23d80 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
23d90 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
23da0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
23db0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
23dc0 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
23dd0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23de0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
23df0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
23e00 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
23e10 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
23e20 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
23e30 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
23e40 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
23e50 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
23e60 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
23e70 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
23e80 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
23e90 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
23ea0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
23eb0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
23ec0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
23ed0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
23ee0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
23ef0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
23f00 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
23f10 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
23f20 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
23f30 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
23f40 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
23f50 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
23f60 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
23f70 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
23f80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
23f90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23fa0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23fb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23fc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23fd0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
23fe0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
23ff0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24000 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
24010 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
24020 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
24030 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24040 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
24050 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
24060 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
24070 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
24080 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24090 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
240a0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
240b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
240c0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
240d0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
240e0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
240f0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
24100 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
24110 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
24120 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
24130 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24140 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
24150 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
24160 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24170 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
24180 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
24190 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
241a0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
241b0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
241c0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
241d0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
241e0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
241f0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
24200 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
24210 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
24220 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
24230 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
24240 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
24250 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
24260 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
24270 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
24280 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
24290 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
242a0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
242b0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
242c0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
242d0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
242e0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
242f0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
24300 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
24310 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
24320 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
24330 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
24340 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
24350 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
24360 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
24370 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
24380 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
24390 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
243a0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
243b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
243c0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
243d0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
243e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
243f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24410 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
24440 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
24450 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
24460 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
24470 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
24480 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
24490 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
244a0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
244b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
244c0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
244d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
244e0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
244f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
24500 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
24510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24540 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
24550 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
24560 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24570 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24580 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
24590 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
245a0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
245b0 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
245c0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
245d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
245e0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
245f0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
24600 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
24610 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
24620 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
24630 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
24640 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
24650 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
24660 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
24670 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
24680 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
24690 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
246a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
246b0 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
246c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
246d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
246e0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
246f0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
24700 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
24710 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
24720 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
24730 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
24740 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
24750 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
24760 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
24770 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
24780 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
24790 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
247a0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
247b0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
247c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
247d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
247e0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
247f0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
24800 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
24810 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
24820 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
24830 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
24840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
24850 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24860 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
24870 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
24880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24890 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
248a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
248b0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
248c0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
248d0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
248e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
248f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
24900 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
24910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24920 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
24930 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
24940 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24950 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24960 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24970 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24980 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
249a0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
249b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
249c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
249d0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
249e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
249f0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
24a00 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
24a10 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
24a20 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
24a30 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
24a40 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24a50 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24a60 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24a70 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24a80 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24a90 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24aa0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24ab0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24ac0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24ad0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24ae0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
24af0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
24b00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
24b10 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
24b20 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
24b30 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
24b40 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24b50 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24b60 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24b70 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24b80 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24b90 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24ba0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24bc0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24bd0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24be0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24bf0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
24c00 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
24c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24c20 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
24c30 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24c60 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24c70 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24c90 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24ca0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24cb0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24cc0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24cd0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24ce0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
24cf0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
24d00 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24d10 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
24d20 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
24d30 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24d40 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24d50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24d60 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24d70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24d90 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24da0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24db0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24dc0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24dd0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24de0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
24df0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24e00 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
24e10 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
24e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24e30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24e40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24e50 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24e60 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
24e70 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
24e80 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
24e90 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
24ea0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24eb0 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
24ec0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
24ed0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
24ee0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
24ef0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
24f00 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
24f10 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24f20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
24f30 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
24f40 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
24f50 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24f60 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
24f70 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
24f80 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
24f90 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
24fa0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
24fb0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
24fc0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
24fd0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
24fe0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
24ff0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
25000 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
25010 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
25020 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25030 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25040 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
25050 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
25060 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
25070 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
25080 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
25090 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
250a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
250b0 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
250c0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
250d0 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
250e0 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
250f0 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
25100 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
25110 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
25120 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
25130 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
25140 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
25150 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
25160 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
25170 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
25180 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
25190 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
251a0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
251b0 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
251c0 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
251d0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
251e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
251f0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
25200 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
25210 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
25220 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25230 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25240 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
25250 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
25260 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
25270 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
25280 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
25290 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
252a0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
252b0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
252c0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
252d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
252e0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
252f0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
25300 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
25310 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
25320 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25330 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25340 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
25350 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
25360 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
25370 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
25380 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
25390 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
253a0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
253b0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
253c0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
253d0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
253e0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
253f0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
25400 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
25410 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
25420 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25430 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25440 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
25450 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
25460 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
25470 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
25480 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
25490 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
254a0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
254b0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
254c0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
254d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
254e0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
254f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25500 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
25510 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25520 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25530 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25540 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
25550 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
25560 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25570 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
25580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
25590 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
255a0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
255b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
255c0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
255d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
255e0 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
255f0 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
25600 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25630 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
25640 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
25650 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
25660 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
25670 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25680 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
256a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
256b0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
256c0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
256d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
256e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
256f0 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
25700 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
25710 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
25720 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
25730 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
25740 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
25750 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
25760 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
25770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25780 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25790 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
257a0 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
257b0 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
257c0 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
257d0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
257e0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
257f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
25800 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
25810 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
25820 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
25830 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
25840 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
25850 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
25860 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
25870 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
25880 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
25890 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
258a0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
258b0 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
258c0 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
258d0 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
258e0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
258f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
25900 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
25910 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
25920 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
25930 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
25940 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
25950 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
25960 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
25970 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
25980 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25990 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
259a0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
259b0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
259c0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
259d0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
259e0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
259f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25a00 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
25a10 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
25a20 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
25a30 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
25a40 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
25a50 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
25a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25a70 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
25a80 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
25a90 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
25aa0 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
25ab0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
25ac0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
25ad0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
25ae0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
25af0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
25b00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
25b10 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
25b20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
25b30 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
25b40 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
25b50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
25b60 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
25b70 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
25b80 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
25b90 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
25ba0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
25bb0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
25bc0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
25bd0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
25be0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
25bf0 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
25c00 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
25c10 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
25c20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
25c30 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
25c40 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
25c50 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
25c60 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
25c70 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
25c80 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
25c90 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
25ca0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
25cb0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
25cc0 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
25cd0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
25ce0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25cf0 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
25d00 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
25d10 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
25d20 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
25d30 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
25d40 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
25d50 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
25d60 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
25d70 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
25d80 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
25d90 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
25da0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
25db0 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
25dc0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
25dd0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
25de0 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
25df0 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
25e00 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
25e10 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
25e20 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
25e30 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
25e40 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
25e50 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
25e60 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
25e70 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
25e80 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
25e90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
25ea0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
25eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25ec0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25ee0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
25ef0 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
25f00 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
25f10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
25f20 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
25f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25f50 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
25f60 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
25f70 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
25f80 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
25f90 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
25fa0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
25fb0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
25fc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
25fd0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25fe0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25ff0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
26000 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
26010 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
26020 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
26030 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26040 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
26050 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
26060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
26070 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
26080 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
26090 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
260a0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
260b0 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
260c0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
260d0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
260e0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
260f0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
26100 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
26110 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
26120 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
26130 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
26140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26150 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
26160 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
26170 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
26180 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
26190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
261a0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
261b0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
261c0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
261d0 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
261e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
261f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26200 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
26210 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
26220 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
26230 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
26240 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
26250 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
26260 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
26270 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
26280 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
26290 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
262a0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
262b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
262c0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
262d0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
262e0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
262f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
26300 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
26310 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
26320 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26330 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
26340 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
26350 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
26360 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
26370 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
26380 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
26390 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
263a0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
263b0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
263c0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
263d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
263e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
263f0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
26400 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26410 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26420 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
26430 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
26440 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
26450 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
26460 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
26470 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
26480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26490 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
264a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
264b0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
264c0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
264d0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
264e0 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
264f0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
26500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
26510 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26520 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
26530 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26540 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26550 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
26560 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26570 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
26580 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
26590 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
265a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
265b0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
265c0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
265d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
265e0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
265f0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26600 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26610 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26620 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26630 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26640 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
26650 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
26660 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
26670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
26680 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
26690 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
266a0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
266b0 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
266c0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
266d0 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
266e0 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
266f0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
26700 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
26710 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
26720 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26730 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26740 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
26750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
26760 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
26770 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
26780 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
26790 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
267a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
267b0 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
267c0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
267d0 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
267e0 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
267f0 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
26800 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
26810 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
26820 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
26830 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
26840 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
26850 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26860 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
26870 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
26880 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
26890 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
268a0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
268b0 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
268c0 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
268d0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
268e0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
268f0 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
26900 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
26910 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26920 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
26930 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
26940 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
26950 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
26960 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
26970 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
26980 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
26990 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
269a0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
269b0 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
269c0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
269d0 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
269e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
269f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26a00 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26a10 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
26a40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26a50 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
26a90 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
26aa0 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ad0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26ae0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26af0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26b00 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26b10 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26b20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
26b30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
26b40 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
26b50 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
26b60 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
26b70 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
26b80 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
26b90 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
26ba0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
26bb0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
26bc0 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26bd0 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26c00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26c10 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26c20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
26c30 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
26c40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26c50 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
26c60 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c80 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
26c90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26ca0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
26cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26cc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26cd0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26ce0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26cf0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26d00 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26d10 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26d20 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
26d30 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
26d40 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
26d50 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26d60 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
26d70 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
26d80 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
26d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26da0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
26db0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
26dc0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
26dd0 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
26de0 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
26df0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
26e00 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
26e10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26e20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26e30 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
26e40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26e50 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
26e60 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
26e70 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26e80 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
26e90 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
26ea0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
26eb0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
26ec0 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
26ed0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
26ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
26ef0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
26f00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26f10 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
26f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26f30 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
26f40 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
26f50 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
26f60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
26f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26f80 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
26f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26fa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26fc0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
26fd0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
26fe0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
26ff0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
27000 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
27010 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
27020 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
27030 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
27040 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
27050 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
27060 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
27070 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
27080 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
27090 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
270a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
270b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
270c0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
270d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
270e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
270f0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
27100 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
27110 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
27120 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
27130 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
27140 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
27150 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
27160 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27170 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27180 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
27190 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
271a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
271b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
271c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
271d0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
271e0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
271f0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
27200 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
27210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27220 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27230 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27240 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27250 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
27260 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
27270 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
27280 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
27290 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
272a0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
272b0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
272c0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
272d0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
272e0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
272f0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
27300 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
27310 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
27320 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
27330 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
27340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
27350 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
27360 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
27370 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
27380 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
27390 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
273a0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
273b0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
273c0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
273d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
273e0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
273f0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27400 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27410 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
27420 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
27430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
27440 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
27450 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27460 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
27480 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
27490 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
274a0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
274b0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
274c0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
274d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
274e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
274f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
27500 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27510 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
27520 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
27530 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27540 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27550 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
27560 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27570 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27580 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27590 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
275a0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
275b0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
275c0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
275d0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
275e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
275f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
27600 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
27610 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
27620 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
27630 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
27640 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
27650 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
27660 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
27670 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
27680 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
27690 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
276a0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
276b0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
276c0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
276d0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
276e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
276f0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
27700 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
27710 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
27720 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
27730 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
27740 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
27750 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
27760 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27770 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
27780 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
27790 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
277a0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
277b0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
277c0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
277d0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
277e0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
277f0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
27800 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
27810 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
27820 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
27830 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
27840 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
27850 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
27860 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
27870 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
27880 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
27890 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
278a0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
278b0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
278c0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
278d0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
278e0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
278f0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
27900 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
27910 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
27920 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
27930 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
27940 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
27950 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
27960 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
27970 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
27980 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
27990 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
279a0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
279b0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
279c0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
279d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
279e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
279f0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
27a00 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
27a10 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
27a20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
27a30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27a40 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
27a50 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d  e */.){.  u32 am
27a60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
27a70 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
27a80 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27a90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27aa0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
27ab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27ac0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27ad0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27ae0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
27af0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
27b00 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
27b10 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
27b20 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
27b30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27b40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27b50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27b60 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27b80 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
27b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27ba0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27bb0 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
27bc0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27bd0 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
27be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27bf0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27c00 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
27c10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27c20 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
27c30 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
27c40 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
27c50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27c60 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
27c70 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
27c80 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
27c90 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
27ca0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
27cb0 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
27cc0 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
27cd0 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
27ce0 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
27cf0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
27d00 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
27d10 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
27d20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
27d30 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
27d40 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
27d50 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
27d60 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
27d70 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
27d80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27d90 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
27da0 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
27db0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
27dc0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
27dd0 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
27de0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
27df0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
27e00 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
27e10 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
27e20 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
27e30 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
27e40 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
27e50 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
27e60 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
27e70 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
27e80 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
27e90 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
27ea0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
27eb0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
27ec0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
27ed0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
27ee0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
27ef0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
27f00 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
27f10 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
27f20 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
27f30 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
27f40 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
27f50 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
27f60 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
27f70 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
27f80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
27f90 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
27fa0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
27fb0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
27fc0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
27fd0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
27fe0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
27ff0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
28000 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
28010 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
28020 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
28030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
28040 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
28050 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
28060 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
28070 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
28080 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
28090 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
280a0 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
280b0 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
280c0 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
280d0 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
280e0 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
280f0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
28100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
28110 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
28120 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
28130 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72  wPgno){.  BtShar
28140 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
28150 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
28160 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28170 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28180 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28190 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
281a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
281b0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
281c0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
281d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
281e0 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
281f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
28200 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
28210 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
28220 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
28230 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
28240 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28250 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
28260 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
28270 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28280 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
28290 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43  r->iPage++;.  pC
282a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
282b0 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65  iPage] = 0;.  re
282c0 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
282d0 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
282e0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
282f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
28320 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
28330 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
28340 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
28350 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
28360 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
28370 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
28380 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
28390 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
283a0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
283b0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
283c0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
283d0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
283e0 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
283f0 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
28400 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
28410 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
28420 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
28430 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
28440 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
28450 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
28460 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
28470 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
28480 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
28490 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
284a0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
284b0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
284c0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
284d0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
284e0 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
284f0 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
28520 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
28530 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
28540 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
28550 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
28560 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
28570 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
28580 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
28590 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
285a0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
285b0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
285c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
285d0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
285e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
285f0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
28600 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
28610 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
28620 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
28630 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
28640 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
28650 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
28660 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
28670 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
28680 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
28690 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
286a0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
286b0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
286c0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
286d0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
286e0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
286f0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
28700 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
28710 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
28720 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
28730 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
28740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
28750 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
28760 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28770 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28780 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
287a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
287b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
287c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
287d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
287e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
287f0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
28800 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
28810 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
28820 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
28830 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
28840 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
28850 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28860 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28870 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
28880 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
28890 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
288a0 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
288b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
288c0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
288d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
288e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
288f0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
28900 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28910 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c  alidOvfl);.  rel
28920 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
28930 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28940 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a  r->iPage--]);.}.
28950 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28960 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
28970 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
28980 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
28990 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
289a0 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
289b0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
289c0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
289d0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
289e0 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
289f0 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
28a00 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
28a10 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
28a20 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
28a30 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
28a40 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
28a50 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
28a60 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
28a70 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
28a80 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
28a90 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
28aa0 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
28ab0 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
28ac0 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
28ad0 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
28ae0 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
28af0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
28b00 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
28b10 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
28b20 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
28b30 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
28b40 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
28b50 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
28b60 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
28b70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
28b80 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
28b90 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
28ba0 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
28bb0 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
28bc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
28bd0 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
28be0 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
28bf0 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
28c00 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
28c10 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
28c20 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
28c30 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
28c40 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
28c50 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
28c60 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
28c70 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
28c80 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
28c90 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
28ca0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
28cb0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28cc0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
28cd0 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
28ce0 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
28cf0 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
28d00 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
28d10 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
28d20 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
28d30 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
28d40 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
28d50 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
28d60 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
28d70 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28d80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
28d90 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
28da0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
28db0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28dc0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
28dd0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28de0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28df0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
28e00 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
28e10 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
28e20 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
28e30 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
28e40 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28e50 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
28e60 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
28e70 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28e80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28e90 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
28ea0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
28eb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28ec0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
28ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28ee0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
28ef0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
28f00 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
28f10 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
28f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
28f30 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
28f40 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
28f50 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
28f60 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
28f70 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  age ){.      ass
28f80 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
28f90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
28fa0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  0 );.      relea
28fb0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
28fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28fd0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20  >iPage--]);.    
28fe0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
28ff0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
29000 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
29010 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29020 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
29030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29040 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
29050 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
29060 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
29070 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
29080 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
29090 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
290a0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
290b0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
290c0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
290d0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
290e0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
290f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29100 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29110 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
29130 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
29140 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
29150 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
29160 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  y = pCur->apPage
29170 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d  [0]->intKey;.  }
29180 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29190 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
291a0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
291b0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
291c0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
291d0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
291e0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
291f0 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
29200 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
29210 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
29220 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
29230 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
29240 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
29250 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
29260 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
29270 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
29280 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
29290 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
292a0 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
292b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
292c0 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
292d0 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
292e0 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
292f0 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
29300 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
29310 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
29320 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
29330 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
29340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
29350 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
29360 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
29370 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
29380 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
29390 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
293a0 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
293b0 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
293c0 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
293d0 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
293e0 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
293f0 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
29400 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
29410 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
29420 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
29430 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
29440 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
29450 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
29460 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
29470 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
29480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29490 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
294a0 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
294b0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
294c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
294d0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
294e0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
294f0 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
29500 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
29510 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
29520 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
29530 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29540 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
29550 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
29560 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
29570 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
29580 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
29590 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
295a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
295b0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
295c0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
295d0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
295e0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
295f0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29600 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
29610 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29620 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
29630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29640 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29650 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29660 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29670 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
29680 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
29690 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
296a0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
296b0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
296c0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
296d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
296e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
296f0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
29700 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
29710 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
29720 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
29730 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
29740 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
29750 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
29760 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
29770 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
29780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29790 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
297a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
297b0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
297c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
297d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
297e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
297f0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
29800 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
29810 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29820 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
29830 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
29840 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29850 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
29860 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
29870 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
29880 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
29890 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
298a0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
298b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
298c0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
298d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
298e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
298f0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
29900 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29910 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
29920 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
29930 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
29940 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
29950 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
29960 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
29970 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
29980 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
29990 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
299a0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
299b0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
299c0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
299d0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
299e0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
299f0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
29a00 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
29a10 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29a20 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
29a30 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
29a40 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
29a50 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
29a60 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
29a70 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
29a80 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
29a90 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29aa0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
29ab0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
29ac0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
29ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29ae0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
29af0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
29b00 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29b10 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
29b20 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29b30 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29b40 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
29b50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29b60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
29b70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
29b80 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
29b90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29ba0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
29bb0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
29bc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29bd0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
29be0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
29bf0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
29c00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29c10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
29c20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29c30 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
29c40 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
29c50 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
29c60 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
29c70 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
29c80 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
29c90 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
29ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29cb0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
29cc0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
29cd0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
29ce0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29cf0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
29d00 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
29d10 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
29d20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
29d30 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
29d40 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
29d50 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
29d60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
29d70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29d80 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
29d90 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
29da0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
29db0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29dc0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29dd0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29de0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29df0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
29e00 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
29e10 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
29e20 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
29e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29e40 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29e50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29e60 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
29e70 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
29e80 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
29e90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29ea0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
29eb0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
29ec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29ed0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29ee0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ef0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
29f00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
29f10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
29f20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
29f30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
29f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
29f50 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29f60 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29f70 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29f80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29f90 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
29fa0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
29fb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
29fc0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
29fd0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
29fe0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
29ff0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a000 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2a010 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
2a020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a030 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a040 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
2a050 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a060 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a080 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2a090 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2a0a0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
2a0b0 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
2a0c0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
2a0d0 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
2a0e0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
2a0f0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
2a100 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a110 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
2a120 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2a130 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
2a140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2a150 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
2a160 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
2a170 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
2a180 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
2a190 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
2a1a0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2a1b0 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
2a1c0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
2a1d0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
2a1e0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
2a1f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a200 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
2a210 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
2a220 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2a230 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2a240 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a250 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
2a260 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a270 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
2a280 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a290 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a2a0 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
2a2b0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2a2c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2a2d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2a2e0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2a2f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a300 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2a310 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2a320 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
2a330 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a340 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a350 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a360 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2a370 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2a380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a390 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a3a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a3b0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
2a3c0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2a3d0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2a3e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2a3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2a410 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2a420 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
2a430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a440 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a450 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
2a460 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
2a470 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2a490 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
2a4a0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2a4b0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
2a4c0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
2a4d0 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
2a4e0 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
2a4f0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
2a500 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
2a510 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
2a520 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
2a530 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
2a540 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
2a550 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
2a560 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
2a570 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
2a580 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
2a590 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2a5a0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
2a5b0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
2a5c0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
2a5d0 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
2a5e0 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
2a5f0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
2a600 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
2a610 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
2a620 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
2a630 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2a640 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
2a650 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
2a660 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
2a670 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
2a680 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2a690 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
2a6a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2a6b0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
2a6c0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
2a6d0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
2a6e0 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
2a6f0 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
2a700 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
2a710 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
2a720 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
2a730 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2a740 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
2a750 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a760 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a770 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2a7a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
2a7b0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
2a7c0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
2a7e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
2a7f0 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
2a800 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
2a810 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
2a820 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
2a830 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a840 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a850 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a860 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
2a870 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
2a880 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
2a890 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
2a8a0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2a8b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a8c0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a8e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
2a8f0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a900 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
2a910 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
2a920 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
2a930 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
2a940 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
2a950 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
2a960 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
2a970 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
2a980 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
2a990 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2a9a0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2a9b0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2a9c0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2a9d0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2a9e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2a9f0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2aa00 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2aa10 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2aa20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2aa30 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2aa40 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2aa50 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2aa60 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2aa70 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2aa80 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2aa90 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2aaa0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2aab0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2aac0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2aad0 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2aae0 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2aaf0 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2ab00 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ab10 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ab20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ab30 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2ab40 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2ab50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ab60 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
2ab70 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2ab80 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2ab90 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
2aba0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2abb0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
2abc0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2abd0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29  r->curIntKey!=0)
2abe0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2abf0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2ac00 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2ac10 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2ac20 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2ac30 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2ac40 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2ac50 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2ac60 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b  k */.  if( pIdxK
2ac70 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72  ey==0.   && pCur
2ac80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ac90 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
2aca0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2acb0 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
2acc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2acd0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2ace0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2acf0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2ad00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ad10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
2ad20 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2ad30 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2ad40 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
2ad50 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2ad60 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2ad70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ad80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2ad90 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
2ada0 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
2adb0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
2adc0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
2add0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
2ade0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
2adf0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2ae00 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2ae10 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
2ae20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2ae30 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
2ae40 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2ae50 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
2ae60 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2ae70 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ae80 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
2ae90 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
2aea0 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
2aeb0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2aec0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2aed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2aee0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aef0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2af00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2af10 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
2af20 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2af30 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2af40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2af50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
2af60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2af70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2af80 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
2af90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2afa0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2afb0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2afc0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2afd0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
2afe0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2aff0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2b000 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2b010 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2b020 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2b030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b040 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
2b050 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2b060 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d  ]->intKey==pCur-
2b070 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
2b080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
2b090 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  rIntKey || pIdxK
2b0a0 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
2b0b0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
2b0c0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
2b0d0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
2b0e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2b0f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b100 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2b110 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2b140 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
2b150 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
2b160 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
2b170 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
2b180 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
2b190 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
2b1a0 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
2b1b0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
2b1c0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
2b1d0 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
2b1e0 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
2b1f0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
2b200 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
2b210 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
2b220 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
2b230 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
2b240 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2b250 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
2b260 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
2b270 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
2b280 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
2b290 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
2b2a0 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
2b2b0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
2b2c0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
2b2d0 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
2b2e0 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
2b2f0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
2b300 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
2b310 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2b320 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2b330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b340 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
2b350 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
2b360 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
2b370 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2b380 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
2b390 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
2b3a0 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
2b3b0 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
2b3c0 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
2b3d0 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
2b3e0 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
2b3f0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
2b400 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b410 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b420 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
2b430 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
2b440 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2b450 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
2b460 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
2b470 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2b480 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2b490 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2b4a0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2b4b0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2b4c0 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
2b4d0 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
2b4e0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
2b4f0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2b500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b510 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b530 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2b540 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2b550 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2b560 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2b570 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2b580 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2b590 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2b5a0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2b5b0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2b5c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b5d0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2b5e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2b5f0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2b600 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2b610 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2b620 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2b630 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2b640 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2b650 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2b660 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2b670 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2b680 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2b690 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2b6a0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2b6b0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2b6c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b6d0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2b6e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2b6f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2b700 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2b710 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2b720 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2b730 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2b740 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b750 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2b760 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b770 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2b780 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2b790 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2b7a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b7b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2b7c0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2b7d0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2b7e0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2b7f0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2b800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2b810 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2b820 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2b830 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2b840 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2b850 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2b860 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2b870 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2b880 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2b890 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2b8a0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2b8b0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2b8c0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2b8d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2b8e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2b8f0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2b900 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2b910 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2b920 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2b930 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2b940 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2b950 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2b960 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2b970 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2b980 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2b990 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2b9a0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2b9b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2b9c0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2b9d0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2b9e0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2b9f0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2ba00 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2ba10 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2ba20 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2ba30 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2ba40 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2ba50 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2ba60 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2ba70 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2ba80 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2ba90 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2baa0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2bab0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2bac0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2bad0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2bae0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2baf0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2bb00 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2bb10 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2bb20 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2bb30 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2bb40 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2bb50 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2bb60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2bb70 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2bb80 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2bb90 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2bba0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2bbb0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2bbc0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2bbd0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2bbe0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2bbf0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2bc00 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2bc10 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2bc20 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2bc30 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2bc40 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2bc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bc60 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2bc70 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2bc80 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2bc90 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2bca0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2bcb0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2bcc0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2bcd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bce0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2bcf0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2bd00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2bd10 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2bd20 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2bd30 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2bd40 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2bd50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2bd60 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2bd70 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2bd80 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2bd90 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2bda0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2bdb0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2bdc0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2bdd0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2bde0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2bdf0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2be00 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2be10 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2be20 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2be30 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2be40 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2be50 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2be60 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2be70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2be80 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2be90 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2bea0 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2beb0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2bec0 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2bed0 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2bee0 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2bef0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2bf00 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2bf10 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2bf20 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2bf30 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2bf40 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2bf50 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2bf60 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2bf70 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2bf80 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2bf90 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2bfa0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2bfb0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2bfc0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2bfd0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2bfe0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2bff0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2c000 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2c010 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2c020 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2c030 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2c040 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2c050 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2c060 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2c070 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2c080 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2c090 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2c0a0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2c0b0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2c0c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c0d0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2c0e0 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2c0f0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2c100 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2c110 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c120 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2c130 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2c140 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2c150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2c160 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2c170 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c180 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c190 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2c1a0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2c1b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c1c0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2c1d0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2c1e0 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2c1f0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2c200 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2c210 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c220 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c230 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2c240 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c260 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c270 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c280 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2c290 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
2c2a0 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
2c2b0 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
2c2c0 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32  har*)pCellKey, 2
2c2d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c2e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2c2f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c300 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2c310 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c320 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c340 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2c350 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
2c360 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
2c370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c380 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2c390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c3a0 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
2c3b0 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
2c3c0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2c3d0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
2c3e0 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
2c3f0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c400 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
2c410 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
2c420 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c430 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2c440 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
2c450 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2c460 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
2c470 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
2c480 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2c490 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
2c4a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c4b0 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
2c4c0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2c4d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
2c4e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c4f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2c500 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c510 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2c520 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2c530 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
2c540 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c550 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2c560 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c580 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2c590 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c5a0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2c5b0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2c5c0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2c5d0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2c5e0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2c5f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2c600 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2c610 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2c620 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2c630 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2c640 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2c650 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2c660 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c670 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2c680 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c690 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
2c6a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2c6b0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2c6c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c6d0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2c6e0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2c6f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2c700 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2c710 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c720 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2c730 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2c740 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2c750 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2c760 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2c770 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2c780 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2c790 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2c7a0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2c7b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2c7c0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2c7d0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
2c7e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c7f0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2c800 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2c810 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2c820 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2c830 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2c840 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2c850 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c860 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c870 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2c880 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2c890 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  vfl);.  return r
2c8a0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
2c8b0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2c8c0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2c8d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2c8e0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
2c8f0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
2c900 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
2c910 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
2c920 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2c930 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
2c940 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2c950 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
2c960 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
2c970 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
2c980 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
2c990 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
2c9a0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
2c9b0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2c9c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c9d0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
2c9e0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2c9f0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
2ca00 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
2ca10 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
2ca20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
2ca30 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
2ca40 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
2ca50 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
2ca60 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
2ca70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
2ca80 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
2ca90 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
2caa0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
2cab0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
2cac0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
2cad0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
2cae0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
2caf0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
2cb00 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2cb10 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2cb20 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2cb30 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2cb40 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2cb50 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2cb60 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2cb70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cb80 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2cb90 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2cba0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2cbb0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2cbc0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2cbd0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2cbe0 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
2cbf0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2cc00 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2cc10 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2cc20 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
2cc30 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2cc40 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2cc50 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
2cc60 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2cc70 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2cc80 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
2cc90 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
2cca0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2ccb0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2ccc0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2ccd0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2cce0 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
2ccf0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2cd00 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2cd10 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2cd20 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2cd30 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2cd40 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2cd50 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2cd60 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2cd70 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2cd80 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2cd90 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2cda0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2cdb0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2cdc0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2cdd0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2cde0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2cdf0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2ce00 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2ce10 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2ce20 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2ce30 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2ce40 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2ce50 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2ce60 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2ce70 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2ce80 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2ce90 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2cea0 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2ceb0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2cec0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2ced0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2cee0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2cef0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2cf00 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2cf10 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2cf20 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2cf30 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2cf40 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
2cf50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2cf60 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2cf70 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
2cf80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cf90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2cfa0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2cfb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2cfc0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2cfd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2cfe0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2cff0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d000 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66  *pRes==0 );.  if
2d010 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2d020 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2d030 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2d040 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d050 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2d060 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2d070 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2d080 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2d090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d0a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d0b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2d0c0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2d0d0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2d0e0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2d0f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2d100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d110 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2d120 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2d130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d140 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d150 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2d160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2d170 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2d180 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d190 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2d1a0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d1b0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2d1c0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d1d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2d1e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2d200 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2d220 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d230 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d240 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2d250 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d260 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2d270 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d280 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2d290 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2d2a0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2d2b0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2d2c0 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2d2d0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2d2e0 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2d2f0 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2d300 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2d310 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2d320 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2d330 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2d340 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2d350 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2d360 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2d370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d380 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2d390 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2d3a0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2d3b0 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2d3c0 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2d3d0 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2d3e0 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2d3f0 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2d400 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2d410 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2d420 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d430 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2d440 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2d450 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d460 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d470 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2d480 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2d4a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d4b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2d4c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2d4d0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2d4e0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2d4f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2d500 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d510 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2d520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d540 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2d550 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
2d560 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d570 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2d580 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
2d590 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d5a0 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
2d5b0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2d5c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d5d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d5e0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2d5f0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2d600 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d620 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d630 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d660 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d670 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
2d680 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
2d690 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d6a0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d6b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2d6d0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2d6e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2d6f0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2d700 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2d710 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2d720 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2d730 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2d740 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d750 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2d760 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d770 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d780 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d790 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d7a0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2d7b0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2d7c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d7d0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2d7e0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2d7f0 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2d800 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d810 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d820 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2d830 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2d840 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2d850 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2d860 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2d870 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2d880 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d890 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2d8a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d8b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d8c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2d8d0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2d8e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2d8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2d900 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2d910 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2d920 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2d930 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2d940 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2d950 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2d960 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2d970 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2d980 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2d990 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2d9a0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2d9b0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2d9c0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2d9d0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2d9e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2d9f0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2da00 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2da10 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2da20 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2da30 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2da40 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2da50 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2da60 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2da70 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2da80 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2da90 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2daa0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2dab0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2dac0 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2dad0 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2dae0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2daf0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2db00 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2db10 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2db20 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2db30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2db40 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2db50 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2db60 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2db70 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2db80 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2db90 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2dba0 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2dbb0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2dbc0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2dbd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2dbe0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2dbf0 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2dc00 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2dc10 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2dc20 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2dc30 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2dc40 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2dc50 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2dc60 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2dc70 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2dc80 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2dc90 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2dca0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2dcb0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2dcc0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2dcd0 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2dce0 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2dcf0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2dd00 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2dd10 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2dd20 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2dd30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2dd40 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2dd50 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2dd60 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2dd70 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2dd80 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2dd90 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dda0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2ddb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2ddc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2ddd0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2dde0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2ddf0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2de00 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2de10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2de20 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2de30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2de40 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2de50 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2de60 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2de70 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2de80 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2de90 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2dea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2deb0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2dec0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ded0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2dee0 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2def0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2df00 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2df10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2df20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2df30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2df40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2df50 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2df60 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2df70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2df80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2df90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2dfa0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2dfb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2dfc0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2dfd0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2dfe0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2dff0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2e000 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e010 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2e020 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e030 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2e040 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e050 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2e060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e070 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2e080 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2e0a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e0b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e0c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e0d0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2e0e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e0f0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2e100 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e110 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2e120 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2e130 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2e140 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2e150 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2e160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e170 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2e180 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2e190 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2e1a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e1b0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2e1c0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2e1d0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2e1e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2e1f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2e200 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2e210 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2e220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2e240 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2e250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e260 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2e270 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2e280 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2e290 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2e2a0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2e2b0 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
2e2c0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2e2d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2e2e0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
2e2f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e300 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
2e310 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2e320 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e330 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e340 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2e350 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e380 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e390 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2e3a0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2e3b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2e3c0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61   int *pRes){.  a
2e3d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2e3e0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2e3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2e400 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2e410 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2e420 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2e430 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2e440 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2e450 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2e460 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
2e470 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2e480 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2e490 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2e4a0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2e4b0 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
2e4c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e4d0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2e4e0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
2e4f0 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78    || pCur->aiIdx
2e500 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2e510 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  .   || pCur->apP
2e520 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e530 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
2e540 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
2e550 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2e560 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  es);.  }.  pCur-
2e570 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e580 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  ge]--;.  return 
2e590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e5a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2e5b0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2e5c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e5d0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2e5e0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2e5f0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2e600 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2e610 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2e620 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2e630 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2e640 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2e650 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2e660 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2e670 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2e680 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2e690 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2e6a0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2e6b0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2e6c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2e6d0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2e6e0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2e6f0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2e700 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2e710 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2e720 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2e730 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
2e740 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
2e750 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
2e760 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
2e770 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2e780 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2e790 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2e7a0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2e7b0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2e7c0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2e7d0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2e7e0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2e7f0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2e800 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2e810 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2e820 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2e830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e840 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2e850 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2e860 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2e870 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2e880 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2e890 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2e8a0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2e8b0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2e8c0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2e8d0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2e8e0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2e8f0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2e900 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2e910 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2e920 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2e930 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2e940 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2e950 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2e960 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2e970 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2e980 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2e990 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2e9a0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2e9b0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2e9c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2e9d0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2e9e0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2e9f0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2ea00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2ea10 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2ea20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2ea30 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2ea40 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2ea50 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2ea60 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2ea70 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2ea80 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2ea90 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2eaa0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2eab0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2eac0 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2ead0 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2eae0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2eaf0 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2eb00 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2eb10 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2eb20 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2eb30 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2eb40 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2eb50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2eb60 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2eb70 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2eb80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2eb90 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2eba0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2ebb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2ebc0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2ebd0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2ebe0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2ebf0 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2ec00 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2ec10 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2ec20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ec30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2ec40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2ec50 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2ec60 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2ec70 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2ec80 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2ec90 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2eca0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2ecb0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2ecc0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2ecd0 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
2ece0 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
2ecf0 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
2ed00 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2ed10 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
2ed20 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
2ed30 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2ed40 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ed50 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
2ed60 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
2ed70 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2ed80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
2ed90 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
2eda0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
2edb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2edc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2edd0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
2ede0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2edf0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
2ee00 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
2ee10 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
2ee20 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
2ee30 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
2ee40 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
2ee50 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
2ee60 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
2ee70 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
2ee80 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
2ee90 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
2eea0 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
2eeb0 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
2eec0 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
2eed0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
2eee0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2eef0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
2ef00 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
2ef10 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
2ef20 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2ef30 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
2ef40 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2ef50 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
2ef60 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
2ef70 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2ef80 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
2ef90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2efa0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2efb0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2efc0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
2efd0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2efe0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
2eff0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2f000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
2f010 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
2f020 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
2f030 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
2f040 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2f050 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
2f060 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
2f070 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2f080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f090 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
2f0a0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2f0b0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2f0c0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
2f0d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2f0e0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
2f0f0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2f100 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2f110 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
2f120 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
2f130 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
2f140 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
2f150 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
2f160 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
2f170 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
2f180 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
2f190 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
2f1a0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
2f1b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f1c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2f1d0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2f1e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f1f0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
2f200 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f210 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
2f220 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
2f230 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
2f240 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
2f250 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
2f260 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
2f270 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
2f280 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
2f290 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
2f2a0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
2f2b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
2f2c0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
2f2d0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2f2e0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2f2f0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
2f300 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
2f310 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
2f320 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f330 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f340 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
2f350 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
2f360 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
2f370 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
2f380 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2f390 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f3a0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
2f3b0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
2f3c0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
2f3d0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
2f3e0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
2f3f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2f400 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
2f410 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2f420 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
2f430 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
2f440 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
2f450 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2f460 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2f470 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2f480 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2f490 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2f4a0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
2f4b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
2f4c0 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
2f4d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
2f4e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
2f4f0 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
2f500 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
2f510 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
2f520 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2f530 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
2f540 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
2f550 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
2f560 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
2f570 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2f580 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2f590 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
2f5a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2f5b0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
2f5c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
2f5d0 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
2f5e0 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
2f5f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f600 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f620 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2f630 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
2f640 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2f650 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
2f660 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2f670 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2f680 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
2f690 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f6a0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
2f6b0 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2f6c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2f6d0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
2f6e0 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
2f6f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f700 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
2f710 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
2f720 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
2f730 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
2f740 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
2f750 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
2f760 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
2f770 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
2f780 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2f790 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
2f7a0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
2f7b0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
2f7c0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2f7d0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
2f7e0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
2f7f0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
2f800 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
2f810 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
2f820 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
2f830 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
2f840 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
2f850 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
2f860 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
2f870 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
2f880 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
2f890 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f8a0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2f8b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f8c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f8d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f8e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
2f900 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2f910 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2f920 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f930 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2f940 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2f950 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2f960 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
2f970 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
2f980 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2f990 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
2f9a0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
2f9b0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
2f9c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2f9d0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
2f9e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
2f9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
2fa00 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
2fa10 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
2fa20 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
2fa30 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2fa40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fa50 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
2fa60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2fa70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
2fa80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2fa90 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
2faa0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
2fab0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2fac0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
2fad0 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
2fae0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2faf0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
2fb00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2fb10 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
2fb20 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
2fb30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
2fb40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2fb50 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
2fb60 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2fb70 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
2fb80 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
2fb90 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2fba0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2fbb0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2fbc0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
2fbd0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2fbe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fbf0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2fc00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fc10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2fc20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fc30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fc50 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
2fc60 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2fc70 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2fc80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2fc90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2fca0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2fcb0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2fcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fcd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2fcf0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2fd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2fd10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fd30 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fd40 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fd50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fd60 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
2fd70 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2fd80 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2fd90 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2fda0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2fdb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2fdc0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
2fdd0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
2fde0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
2fdf0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
2fe00 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
2fe10 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
2fe20 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
2fe30 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
2fe40 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
2fe50 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
2fe60 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
2fe70 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
2fe80 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
2fe90 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
2fea0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
2feb0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2fec0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
2fed0 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
2fee0 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
2fef0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ff00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ff10 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2ff20 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2ff30 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2ff40 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2ff50 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
2ff60 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2ff70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ff80 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
2ff90 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2ffa0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2ffb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ffc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ffd0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ffe0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2fff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30010 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
30020 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
30030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30040 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30050 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
30060 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
30070 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
30080 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30090 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
300a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
300b0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
300c0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
300d0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
300e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
300f0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
30100 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
30110 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
30120 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
30130 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
30140 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
30150 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
30160 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30170 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
30180 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
30190 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
301a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
301b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
301c0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
301d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
301e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
301f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
30200 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30220 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30230 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30240 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
30250 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30260 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
30270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30280 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30290 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
302a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
302b0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
302c0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
302d0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
302e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
302f0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
30300 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
30310 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
30320 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
30330 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
30340 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
30350 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
30360 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
30370 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
30380 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
30390 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
303a0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
303b0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
303c0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
303d0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
303e0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
303f0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
30400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
30410 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
30420 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
30430 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
30440 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
30450 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
30460 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
30480 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
30490 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
304a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
304b0 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
304c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
304d0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
304e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
304f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
30500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30510 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
30520 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30530 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
30540 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
30550 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
30560 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
30570 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
30580 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
30590 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
305a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
305b0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
305c0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
305d0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
305e0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
305f0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
30600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30610 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30630 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
30640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
30670 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
30680 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
30690 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
306a0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
306b0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
306c0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
306d0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
306e0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
306f0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
30700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
30710 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30720 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30730 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30740 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30750 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
30760 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
30770 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
30780 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
30790 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
307a0 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
307b0 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
307c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
307d0 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
307e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
307f0 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
30800 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
30810 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
30820 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30830 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
30840 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30860 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
30870 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
30880 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
30890 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
308a0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
308b0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
308c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
308d0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
308e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
308f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30900 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30910 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
30920 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
30930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
30940 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
30950 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
30960 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
30970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30980 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
30990 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
309a0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
309b0 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
309c0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
309d0 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
309e0 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
309f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
30a00 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
30a10 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
30a20 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
30a30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30a50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30a70 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
30a80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30ab0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30ac0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
30ad0 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61             *ppPa
30ae0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
30af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30b00 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
30b10 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
30b20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30b30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30b40 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
30b50 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
30b60 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
30b70 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
30b80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
30b90 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
30ba0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
30bb0 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
30bc0 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
30bd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
30be0 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
30bf0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
30c00 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
30c10 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
30c20 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
30c30 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
30c40 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
30c50 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
30c60 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
30c70 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
30c80 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
30c90 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
30ca0 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
30cb0 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
30cc0 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
30cd0 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
30ce0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
30cf0 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
30d00 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
30d10 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
30d20 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
30d30 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
30d40 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
30d50 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
30d60 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
30d70 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
30d80 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
30d90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
30da0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
30db0 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
30dc0 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
30dd0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
30de0 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
30df0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
30e00 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
30e10 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
30e20 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
30e30 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
30e40 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
30e50 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
30e60 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
30e70 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
30e80 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
30e90 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
30ea0 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
30eb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30ec0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
30ed0 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
30ee0 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
30ef0 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
30f00 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
30f10 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
30f20 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
30f30 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
30f40 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
30f50 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
30f60 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
30f70 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
30f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30f90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
30fa0 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
30fb0 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
30fc0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
30fd0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
30fe0 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
30ff0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31000 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
31010 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
31020 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31030 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
31040 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
31050 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
31060 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31070 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
31080 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
31090 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
310a0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
310b0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
310c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
310d0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
310e0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
310f0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
31100 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
31110 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
31120 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
31130 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
31140 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
31150 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
31160 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
31170 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
31180 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
31190 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
311a0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
311b0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
311c0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
311d0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
311e0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
311f0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
31200 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
31210 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
31220 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
31230 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
31240 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
31250 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
31260 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
31270 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31280 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
31290 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  &pPg, bNoContent
312a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
312b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
312c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
312d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
312e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
312f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31300 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
31310 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31320 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42  urn rc;.      pB
31330 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
31340 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
31350 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31360 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d  AGE(pBt) ){ pBt-
31370 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20  >nPage++; }.    
31380 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74  }.#endif.    put
31390 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29  4byte(28 + (u8*)
313a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
313b0 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ta, pBt->nPage);
313c0 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42  .    *pPgno = pB
313d0 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61  t->nPage;..    a
313e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
313f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31400 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
31410 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31420 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
31430 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
31440 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
31450 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31470 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
31480 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
31490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
314a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
314b0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
314c0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
314d0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
314e0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
314f0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
31500 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
31510 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
31520 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
31530 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
31540 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
31550 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
31560 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
31570 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
31580 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
31590 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
315a0 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
315b0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
315c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
315d0 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
315e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
315f0 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
31600 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
31610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31620 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31630 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
31640 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
31650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31660 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
31670 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
31680 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
31690 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
316a0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
316b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
316c0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
316d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
316e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
316f0 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
31700 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
31710 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
31720 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
31730 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
31740 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
31750 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
31760 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
31770 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
31780 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
31790 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
317a0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
317b0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
317c0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
317d0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
317e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
317f0 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
31800 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
31810 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
31820 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
31830 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
31840 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
31850 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
31860 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
31870 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
31880 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
31890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
318a0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
318b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
318c0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
318d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
318e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
318f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
31900 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
31910 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
31920 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
31930 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
31940 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
31950 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31970 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
31980 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
31990 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
319c0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
319d0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
31a00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31a10 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
31a20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31a30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
31a40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
31a50 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
31a60 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
31a70 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
31a80 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
31a90 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
31aa0 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
31ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
31ac0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
31ad0 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
31ae0 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
31af0 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
31b00 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
31b10 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
31b20 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
31b30 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
31b40 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
31b50 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
31b60 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
31b70 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
31b80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
31b90 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
31ba0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
31bb0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
31bc0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
31bd0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
31be0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
31bf0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
31c00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
31c10 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
31c20 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
31c30 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
31c40 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
31c50 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
31c60 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
31c70 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
31c80 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
31c90 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
31ca0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
31cb0 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
31cc0 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
31cd0 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
31ce0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
31cf0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
31d00 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
31d10 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
31d20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31d30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31d40 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
31d50 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31d60 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
31d70 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
31d80 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
31d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
31da0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31db0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
31dc0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
31dd0 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
31de0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31df0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
31e00 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
31e10 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
31e20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
31e30 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
31e40 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
31e50 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
31e60 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
31e70 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
31e80 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
31e90 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
31ea0 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
31eb0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
31ec0 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
31ed0 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
31ee0 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
31ef0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
31f00 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
31f10 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
31f20 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
31f30 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31f40 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
31f50 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
31f60 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
31f70 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
31f80 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
31f90 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
31fa0 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
31fb0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
31fc0 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
31fd0 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
31fe0 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
31ff0 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
32000 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
32010 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
32020 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
32030 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
32040 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
32050 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
32060 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
32070 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
32080 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
32090 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
320a0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
320b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
320c0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
320d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
320e0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
320f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32110 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32120 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
32130 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
32140 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
32150 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
32160 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
32170 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
32180 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
32190 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
321a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
321b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
321c0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
321d0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
321e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
321f0 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
32200 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
32210 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
32220 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
32230 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
32240 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
32250 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
32260 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
32270 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
32280 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32290 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
322a0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
322b0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
322c0 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
322d0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
322e0 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
322f0 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
32300 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
32310 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
32320 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
32330 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
32340 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
32350 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
32360 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
32370 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
32380 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
32390 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
323a0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
323b0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
323c0 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
323d0 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
323e0 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
323f0 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
32400 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
32410 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
32420 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
32430 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
32440 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
32450 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
32460 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
32470 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
32480 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
32490 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
324a0 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
324b0 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
324c0 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
324d0 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
324e0 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
324f0 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
32500 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
32510 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
32520 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
32530 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
32540 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
32550 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
32560 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  8"..      **.   
32570 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
32580 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36  F: R-19920-11576
32590 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20   However, newer 
325a0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
325b0 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a  te still.      *
325c0 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68  * avoid using th
325d0 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69  e last six entri
325e0 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69  es in the freeli
325f0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72  st trunk page ar
32600 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ray in.      ** 
32610 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62  order that datab
32620 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65  ase files create
32630 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
32640 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
32650 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65  n be.      ** re
32660 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ad by older vers
32670 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a  ions of SQLite..
32680 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
32690 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
326a0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
326b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
326c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
326d0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
326e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
326f0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
32700 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
32710 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
32720 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
32730 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
32740 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
32750 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
32760 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
32770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32780 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
32790 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
327a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
327b0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
327c0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
327d0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
327e0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
327f0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
32800 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
32810 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
32820 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
32830 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
32840 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32850 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
32860 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
32870 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
32880 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
32890 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
328a0 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
328b0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
328c0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
328d0 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
328e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
328f0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
32900 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
32910 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
32920 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
32930 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
32940 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
32950 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
32960 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
32970 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
32980 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
32990 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
329a0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
329b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
329c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
329d0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
329e0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
329f0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
32a00 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
32a10 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
32a20 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
32a30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32a40 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
32a50 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
32a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
32a70 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32a80 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
32a90 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
32aa0 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
32ab0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
32ac0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
32ad0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32ae0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
32af0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
32b00 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
32b10 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
32b20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
32b30 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
32b40 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
32b50 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
32b60 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
32b70 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
32b80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
32b90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
32ba0 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
32bb0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
32bc0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
32bd0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
32be0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
32bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32c00 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
32c10 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
32c20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
32c30 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
32c40 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
32c50 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
32c60 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
32c70 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65  ven Cell.  Write
32c80 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65   the.** local Ce
32c90 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d  ll size (the num
32ca0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20  ber of bytes on 
32cb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
32cc0 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f  e, omitting.** o
32cd0 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70  verflow) into *p
32ce0 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nSize..*/.static
32cf0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a   int clearCell(.
32d00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32d10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
32d20 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
32d30 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f  ains the Cell */
32d40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32d50 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46   *pCell,    /* F
32d60 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
32d70 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a   Cell */.  u16 *
32d80 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
32d90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
32da0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c   size of the Cel
32db0 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42  l here */.){.  B
32dc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32dd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
32de0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
32df0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
32e00 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
32e10 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
32e20 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
32e30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32e40 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
32e50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
32e60 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
32e70 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
32e80 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20  nfo);.  *pnSize 
32e90 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
32ea0 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d  if( info.nLocal=
32eb0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
32ec0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32ed0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
32ee0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
32ef0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
32f00 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
32f10 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
32f20 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20 3e 20 70  info.nSize-1 > p
32f30 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
32f40 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
32f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32f60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
32f70 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
32f80 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
32f90 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
32fa0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
32fb0 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65  ell + info.nSize
32fc0 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74 28   - 4);.  assert(
32fd0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32fe0 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
32ff0 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
33000 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
33010 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
33020 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
33030 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
33040 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
33050 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
33060 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20   nOvfl>0 || .   
33070 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20   (CORRUPT_DB && 
33080 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b  (info.nPayload +
33090 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
330a0 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
330b0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
330c0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
330d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
330e0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
330f0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
33100 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
33110 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
33120 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
33130 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
33140 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
33150 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
33160 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
33170 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
33180 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
33190 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
331a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
331b0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
331c0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
331d0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
331e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
331f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
33210 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
33220 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
33230 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
33240 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
33250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
33260 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33270 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
33280 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
33290 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
332a0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
332b0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
332c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
332d0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
332e0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
332f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
33300 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
33310 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
33320 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
33330 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
33340 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
33350 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
33360 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
33370 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
33380 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
33390 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
333a0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
333b0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
333c0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
333d0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
333e0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
333f0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
33400 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
33410 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
33420 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
33430 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
33440 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
33450 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
33460 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
33470 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
33480 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
33490 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
334a0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
334b0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
334c0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
334d0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
334e0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
334f0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
33500 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
33510 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
33520 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
33530 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
33540 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
33550 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
33560 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
33570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
33580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
33590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
335a0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
335b0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
335c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
335d0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
335e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
335f0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
33600 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
33610 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33620 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
33630 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
33640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33650 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
33660 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
33670 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
33680 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
33690 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
336a0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
336b0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
336c0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
336d0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
336e0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
336f0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
33700 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
33710 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
33720 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
33730 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
33740 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
33750 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
33760 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
33770 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
33780 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
33790 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
337a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
337b0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
337c0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
337d0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
337e0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
337f0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
33800 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
33810 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
33820 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
33830 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
33840 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
33850 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
33860 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
33870 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33890 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
338a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
338b0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
338c0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
338d0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
338e0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
338f0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72  l */.  const Btr
33900 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20  eePayload *pX,  
33910 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
33920 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63   with which to c
33930 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c  onstruct the cel
33940 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  l */.  int *pnSi
33950 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
33960 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
33970 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
33980 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
33990 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
339a0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
339b0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
339c0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
339d0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
339e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
339f0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
33a00 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
33a10 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
33a20 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
33a30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33a40 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
33a50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
33a60 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
33a70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33a80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33a90 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
33aa0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
33ab0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
33ac0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
33ad0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
33ae0 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
33af0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
33b00 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
33b10 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
33b20 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
33b30 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
33b40 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
33b50 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
33b60 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
33b70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
33b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33b90 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
33ba0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
33bb0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
33bc0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
33bd0 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
33be0 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  dPtrSize;.  if( 
33bf0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
33c00 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
33c10 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e  pX->nData + pX->
33c20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20  nZero;.    pSrc 
33c30 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20  = pX->pData;.   
33c40 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74   nSrc = pX->nDat
33c50 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
33c60 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
33c70 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c   ); /* fillInCel
33c80 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  l() only called 
33c90 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  for leaves */.  
33ca0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
33cb0 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
33cc0 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
33cd0 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  ad);.    nHeader
33ce0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
33cf0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
33d00 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29  (u64*)&pX->nKey)
33d10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
33d20 73 73 65 72 74 28 20 70 58 2d 3e 6e 44 61 74 61  ssert( pX->nData
33d30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
33d40 74 28 20 70 58 2d 3e 6e 5a 65 72 6f 3d 3d 30 20  t( pX->nZero==0 
33d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33d60 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  X->nKey<=0x7ffff
33d70 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21  fff && pX->pKey!
33d80 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d  =0 );.    nSrc =
33d90 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
33da0 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70  )pX->nKey;.    p
33db0 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a  Src = pX->pKey;.
33dc0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
33dd0 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
33de0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
33df0 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  load);.  }.  .  
33e00 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
33e10 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20  ayload */.  if( 
33e20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
33e30 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
33e40 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
33e50 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
33e60 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
33e70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
33e80 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
33e90 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
33ea0 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
33eb0 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
33ec0 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
33ed0 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
33ee0 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
33ef0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
33f00 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
33f10 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
33f20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
33f30 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
33f40 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33f50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
33f60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33f70 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
33f80 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
33f90 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
33fa0 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
33fb0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
33fc0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
33fd0 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
33fe0 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
33ff0 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
34000 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
34010 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
34020 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
34030 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
34040 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
34050 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
34060 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
34070 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
34080 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
34090 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
340a0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
340b0 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
340c0 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
340d0 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
340e0 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
340f0 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
34100 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
34110 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
34140 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
34150 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
34160 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
34170 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
34180 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
34190 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
341a0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
341b0 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
341c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
341d0 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
341e0 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
341f0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
34200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
34210 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
34220 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
34230 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
34240 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
34250 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
34260 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
34270 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
34280 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
34290 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
342a0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
342b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
342c0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
342d0 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69  nHeader==(int)(i
342e0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
342f0 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
34300 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
34310 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  pX->nKey );.    
34320 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
34330 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
34340 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
34350 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
34360 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  Local );.  }.#en
34370 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
34380 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
34390 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
343a0 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
343b0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
343c0 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
343d0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
343e0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
343f0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
34400 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34410 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
34420 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
34430 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
34440 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
34450 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
34460 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
34470 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
34480 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
34490 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
344a0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
344b0 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
344c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
344d0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
344e0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
344f0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
34500 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
34510 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
34520 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
34530 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
34540 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
34550 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
34560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34570 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
34580 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
34590 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
345a0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
345b0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
345c0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
345d0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
345e0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
345f0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
34600 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
34610 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
34620 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
34630 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
34640 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
34650 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
34660 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
34670 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
34680 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
34690 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
346a0 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
346b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
346c0 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
346d0 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
346e0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
346f0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
34700 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
34710 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
34720 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
34730 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
34740 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
34750 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
34760 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
34770 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
34780 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34790 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
347a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
347b0 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
347c0 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
347d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
347e0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
347f0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
34800 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
34810 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
34820 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
34830 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34840 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
34850 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
34860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34870 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
34880 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
34890 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
348a0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
348b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
348c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
348d0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
348e0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
348f0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
34900 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
34910 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
34920 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
34930 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
34940 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
34950 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
34960 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34970 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34980 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34990 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
349a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
349b0 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
349c0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
349d0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
349e0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
349f0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
34a00 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
34a10 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
34a20 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
34a30 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
34a40 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34a50 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34a60 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34a70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34a80 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34a90 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34aa0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
34ab0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
34ac0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
34ad0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
34ae0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
34af0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
34b00 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
34b10 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
34b20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
34b30 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
34b40 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
34b50 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
34b60 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
34b70 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
34b80 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
34b90 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
34ba0 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
34bb0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
34bc0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
34bd0 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
34be0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
34bf0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
34c00 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
34c10 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
34c20 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34c30 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
34c40 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
34c50 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
34c60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34c70 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34c80 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
34c90 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
34ca0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
34cb0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
34cc0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
34cd0 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
34ce0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
34cf0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
34d00 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
34d10 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
34d20 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
34d30 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34d40 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34d50 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34d60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34d70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
34d80 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
34d90 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
34da0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
34db0 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
34dc0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
34dd0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
34de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
34df0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
34e00 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
34e10 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
34e20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
34e30 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
34e40 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
34e50 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
34e60 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
34e70 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34e90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
34ea0 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
34eb0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
34ec0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
34ed0 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
34ee0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
34ef0 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
34f00 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
34f10 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
34f20 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
34f30 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
34f40 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
34f50 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
34f60 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
34f70 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
34f80 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
34f90 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
34fa0 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
34fb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
34fc0 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
34fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
34fe0 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
34ff0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
35000 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
35010 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
35020 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
35030 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
35040 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
35050 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
35060 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
35070 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
35080 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
35090 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
350a0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
350b0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
350c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
350d0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
350e0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
350f0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
35100 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
35110 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
35120 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
35130 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
35140 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
35150 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
35160 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
35170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
35180 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
35190 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
351a0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
351b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
351c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
351d0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
351e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
351f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
35200 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35210 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
35220 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
35230 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
35240 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
35250 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
35260 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
35270 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
35280 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
35290 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
352a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
352b0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
352c0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
352d0 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
352e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
352f0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
35300 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
35310 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
35320 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
35330 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
35340 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
35350 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
35360 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
35370 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
35380 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
35390 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
353a0 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
353b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
353c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
353d0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
353e0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
353f0 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
35400 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
35410 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
35420 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
35430 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
35440 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35450 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
35460 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
35470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
35480 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
35490 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
354a0 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
354b0 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
354c0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
354d0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
354e0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
354f0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
35500 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
35510 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
35520 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
35530 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
35540 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
35550 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
35560 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
35570 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
35580 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
35590 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
355a0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
355b0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
355c0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
355d0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
355e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
355f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
35600 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
35610 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
35620 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
35630 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
35640 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
35650 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
35660 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
35670 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
35680 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
35690 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
356a0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
356b0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
356c0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
356d0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
356e0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
356f0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
35700 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
35710 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
35720 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
35730 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53  * *pRC must be S
35740 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
35750 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35760 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
35770 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
35780 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
35790 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
357a0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
357b0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
357c0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
357d0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
357e0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
357f0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
35800 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
35810 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
35820 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
35830 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
35840 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
35850 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
35860 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
35870 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
35880 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
35890 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
358a0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
358b0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
358c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
358d0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
358e0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
358f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
35900 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
35910 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
35920 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
35930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
35940 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
35950 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
35960 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
35970 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
35980 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
35990 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
359a0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
359b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
359c0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
359d0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
359e0 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ins;         /* 
359f0 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61  The point in pPa
35a00 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77  ge->aCellIdx[] w
35a10 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73  here no cell ins
35a20 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  erted */..  asse
35a30 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45  rt( *pRC==SQLITE
35a40 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
35a50 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
35a60 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
35a70 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
35a80 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
35a90 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
35aa0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
35ab0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
35ac0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
35ad0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
35ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35af0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
35b00 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35b10 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
35b20 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
35b30 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
35b40 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35b50 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
35b60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35b70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35b80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
35b90 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
35ba0 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
35bb0 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
35bc0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
35bd0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
35be0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
35bf0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
35c00 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
35c10 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
35c20 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
35c30 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
35c40 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
35c50 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
35c60 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
35c70 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
35c80 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
35c90 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
35ca0 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
35cb0 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
35cc0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
35cd0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
35ce0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
35cf0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
35d00 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
35d10 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
35d20 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
35d30 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
35d40 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35d50 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
35d60 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
35d70 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
35d80 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
35d90 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
35da0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
35db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
35dc0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
35dd0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
35de0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
35df0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
35e00 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
35e10 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
35e20 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
35e30 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
35e40 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
35e50 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
35e60 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
35e70 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
35e80 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
35e90 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
35ea0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
35eb0 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
35ec0 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
35ed0 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
35ee0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
35ef0 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
35f00 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
35f10 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
35f20 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
35f30 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
35f40 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
35f50 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
35f60 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
35f70 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
35f80 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
35f90 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
35fa0 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
35fb0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
35fc0 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
35fd0 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
35fe0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
35ff0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
36000 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
36010 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
36020 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
36030 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
36040 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
36050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
36060 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
36070 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
36080 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
36090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
360a0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
360b0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
360c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
360d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
360e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
360f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
36100 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
36110 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
36120 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
36130 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
36140 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
36150 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36160 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
36170 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
36180 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
36190 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
361a0 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
361b0 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
361c0 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
361d0 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
361e0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
361f0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
36200 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
36210 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
36220 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36230 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
36240 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
36250 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
36260 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
36270 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
36280 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
36290 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
362a0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
362b0 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
362c0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
362d0 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
362e0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
362f0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
36300 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
36310 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
36320 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d     pIns = pPage-
36330 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b  >aCellIdx + i*2;
36340 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e  .    memmove(pIn
36350 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50  s+2, pIns, 2*(pP
36360 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29  age->nCell - i))
36370 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
36380 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  Ins, idx);.    p
36390 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
363a0 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20     /* increment 
363b0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a  the cell count *
363c0 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74  /.    if( (++dat
363d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
363e0 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61  et+4])==0 ) data
363f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
36400 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65  t+3]++;.    asse
36410 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
36420 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
36430 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+3])==pPage->
36440 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66  nCell );.#ifndef
36450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36460 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
36470 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
36480 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
36490 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
364a0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
364b0 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
364c0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
364d0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
364e0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
364f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
36500 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
36510 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
36520 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
36530 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
36540 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
36550 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
36560 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a   A CellArray obj
36570 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ect contains a c
36580 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73  ache of pointers
36590 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61   and sizes for a
365a0 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20  .** consecutive 
365b0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c  sequence of cell
365c0 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
365d0 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c 65  held on multiple
365e0 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64   pages..*/.typed
365f0 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72  ef struct CellAr
36600 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73  ray CellArray;.s
36610 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
36620 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  {.  int nCell;  
36630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36640 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
36650 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
36660 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20  MemPage *pRef;  
36670 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
36680 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  ence page */.  u
36690 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
366a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
366b0 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
366c0 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
366d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
366e0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
366f0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36700 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Cell[] */.};../*
36710 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
36720 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20  e cell sizes at 
36730 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c  idx, idx+1, ...,
36740 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65   idx+N-1 have be
36750 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a  en.** computed..
36760 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
36770 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65  opulateCellCache
36780 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
36790 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a  nt idx, int N){.
367a0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
367b0 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43   && idx+N<=p->nC
367c0 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ell );.  while( 
367d0 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  N>0 ){.    asser
367e0 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  t( p->apCell[idx
367f0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
36800 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
36810 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a  0 ){.      p->sz
36820 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70  Cell[idx] = p->p
36830 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36840 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36850 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c  l[idx]);.    }el
36860 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36870 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a  ( CORRUPT_DB ||.
36880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
36890 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d  >szCell[idx]==p-
368a0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
368b0 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
368c0 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20  ell[idx]) );.   
368d0 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20   }.    idx++;.  
368e0 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    N--;.  }.}../*
368f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
36900 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65  ize of the Nth e
36910 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65  lement of the ce
36920 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74  ll array.*/.stat
36930 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
36940 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65  NE u16 computeCe
36950 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
36960 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
36970 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
36980 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  <p->nCell );.  a
36990 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c  ssert( p->szCell
369a0 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  [N]==0 );.  p->s
369b0 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52  zCell[N] = p->pR
369c0 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
369d0 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
369e0 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [N]);.  return p
369f0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73  ->szCell[N];.}.s
36a00 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65 64  tatic u16 cached
36a10 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
36a20 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
36a30 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
36a40 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
36a50 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e   if( p->szCell[N
36a60 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ] ) return p->sz
36a70 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72  Cell[N];.  retur
36a80 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  n computeCellSiz
36a90 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, N);.}../*.*
36aa0 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
36ab0 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
36ac0 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72  rs to nCell b-tr
36ad0 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54  ee page cells. T
36ae0 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20  he .** szCell[] 
36af0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
36b00 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
36b10 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54   of each cell. T
36b20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
36b30 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72  replaces the cur
36b40 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
36b50 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74   page pPg with t
36b60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
36b70 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79  he cell.** array
36b80 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20  ..**.** Some of 
36b90 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  the cells in apC
36ba0 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e  ell[] may curren
36bb0 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  tly be stored in
36bc0 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75   pPg. This.** fu
36bd0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f  nction works aro
36be0 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
36bf0 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d  sed by this by m
36c00 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  aking a copy of 
36c10 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c  any .** such cel
36c20 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  ls before overwr
36c30 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64  iting the page d
36c40 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d  ata..**.** The M
36c50 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65  emPage.nFree fie
36c60 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  ld is invalidate
36c70 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
36c80 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
36c90 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
36ca0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
36cb0 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
36cc0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
36cd0 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  t rebuildPage(. 
36ce0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
36cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d00 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
36d10 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
36d20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36d30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
36d40 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
36d50 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
36d60 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d80 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
36d90 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36db0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
36dc0 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
36dd0 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
36de0 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
36df0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
36e00 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
36e10 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
36e20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
36e30 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
36e40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
36e50 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
36e60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
36e70 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
36e80 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36e90 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
36ea0 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
36eb0 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
36ec0 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
36ed0 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
36ee0 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
36ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
36f00 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
36f10 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
36f20 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
36f30 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36f40 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
36f50 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
36f60 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
36f70 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
36f80 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
36f90 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
36fa0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36fb0 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
36fc0 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
36fd0 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45  N(pCell,aData,pE
36fe0 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43 65  nd) ){.      pCe
36ff0 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c  ll = &pTmp[pCell
37000 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d   - aData];.    }
37010 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a  .    pData -= sz
37020 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Cell[i];.    put
37030 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
37040 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29  (pData - aData))
37050 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
37060 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61  = 2;.    if( pDa
37070 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20  ta < pCellptr ) 
37080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
37090 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
370a0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43  memcpy(pData, pC
370b0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b  ell, szCell[i]);
370c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43  .    assert( szC
370d0 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65  ell[i]==pPg->xCe
370e0 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c  llSize(pPg, pCel
370f0 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
37100 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
37110 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67  ( szCell[i]!=pPg
37120 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
37130 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20  pCell) );.  }.. 
37140 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72   /* The pPg->nFr
37150 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20  ee field is now 
37160 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
37170 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
37180 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50   fix it. */.  pP
37190 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  g->nCell = nCell
371a0 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
371b0 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
371c0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31  yte(&aData[hdr+1
371d0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74  ], 0);.  put2byt
371e0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
371f0 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
37200 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
37210 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
37220 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b  aData);.  aData[
37230 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20  hdr+7] = 0x00;. 
37240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  K;.}../*.** Arra
37260 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
37270 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
37280 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
37290 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
372a0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
372b0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
372c0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
372d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
372e0 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
372f0 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
37300 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
37310 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
37320 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
37330 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
37340 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
37350 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
37360 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
37370 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
37380 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
37390 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
373a0 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
373b0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
373c0 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
373d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
373e0 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
373f0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
37400 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
37410 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37420 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
37430 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
37440 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
37450 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
37460 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
37470 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
37480 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
37490 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
374a0 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
374b0 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
374c0 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
374d0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
374e0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
374f0 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
37500 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
37510 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
37520 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
37530 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
37540 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
37550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37560 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
37570 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
37580 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
37590 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
375a0 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
375b0 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
375c0 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
375d0 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
375e0 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
375f0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
37600 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
37610 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
37620 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
37630 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
37640 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
37650 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
37660 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
37670 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
37680 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
37690 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
376a0 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
376b0 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
376c0 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
376d0 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
376e0 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
376f0 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
37700 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
37710 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
37720 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
37730 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
37740 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
37750 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
37760 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
37770 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
37780 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
37790 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
377a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
377b0 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
377c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
377d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377e0 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
377f0 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
37800 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
37810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37820 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
37830 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
37840 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
37870 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
37880 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
37890 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
378a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
378b0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
378c0 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
378d0 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
378e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
37900 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f  t cell to add */
37910 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37930 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37940 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
37950 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  pPg */.  CellArr
37960 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
37970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37980 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
37990 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
379a0 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
379b0 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20  ta;.  u8 *pData 
379c0 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74  = *ppData;.  int
379d0 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
379e0 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   nCell;.  assert
379f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
37a00 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  pPg->hdrOffset==
37a10 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72  0 );    /* Never
37a20 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
37a30 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  1 */.  for(i=iFi
37a40 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b  rst; i<iEnd; i++
37a50 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72  ){.    int sz, r
37a60 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  c;.    u8 *pSlot
37a70 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65  ;.    sz = cache
37a80 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61  dCellSize(pCArra
37a90 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28  y, i);.    if( (
37aa0 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61  aData[1]==0 && a
37ab0 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28  Data[2]==0) || (
37ac0 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64  pSlot = pageFind
37ad0 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29  Slot(pPg,sz,&rc)
37ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
37af0 28 20 28 70 44 61 74 61 20 2d 20 70 42 65 67 69  ( (pData - pBegi
37b00 6e 29 3c 73 7a 20 29 20 72 65 74 75 72 6e 20 31  n)<sz ) return 1
37b10 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  ;.      pData -=
37b20 20 73 7a 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74   sz;.      pSlot
37b30 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
37b40 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64      /* pSlot and
37b50 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37b60 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  [i] will never o
37b70 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c  verlap on a well
37b80 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64  -formed.    ** d
37b90 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74 68  atabase.  But th
37ba0 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63  ey might for a c
37bb0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
37bc0 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d    Hence use memm
37bd0 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e  ove().    ** sin
37be0 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64  ce memcpy() send
37bf0 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68 20  s SIGABORT with 
37c00 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66  overlapping buff
37c10 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a  ers on OpenBSD *
37c20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
37c30 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61  Slot+sz)<=pCArra
37c40 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20  y->apCell[i].   
37c50 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d        || pSlot>=
37c60 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c  (pCArray->apCell
37c70 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20  [i]+sz).        
37c80 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
37c90 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53  ;.    memmove(pS
37ca0 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70  lot, pCArray->ap
37cb0 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
37cc0 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
37cd0 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44  ptr, (pSlot - aD
37ce0 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
37cf0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
37d00 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  *ppData = pData;
37d10 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
37d20 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
37d30 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43  ll[] contains nC
37d40 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ell pointers to 
37d50 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72  b-tree cells. Ar
37d60 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63  ray szCell .** c
37d70 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
37d80 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
37d90 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
37da0 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20  s function adds 
37db0 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73  the.** space ass
37dc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
37dd0 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72  h cell in the ar
37de0 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72  ray that is curr
37df0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a  ently stored .**
37e00 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
37e10 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70   of pPg to the p
37e20 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  Pg free-list. Th
37e30 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20  e cell-pointers 
37e40 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65  and other.** fie
37e50 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  lds of the page 
37e60 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e  are not updated.
37e70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
37e80 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
37e90 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
37ea0 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20   cells added to 
37eb0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
37ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
37ed0 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65  eFreeArray(.  Me
37ee0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37f00 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f   Page to edit */
37f10 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20  .  int iFirst,  
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f30 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c     /* First cell
37f40 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
37f50 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f70 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65  /* Cells to dele
37f80 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  te */.  CellArra
37f90 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
37fa0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
37fb0 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a   of cells */.){.
37fc0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
37fd0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37fe0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45  .  u8 * const pE
37ff0 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  nd = &aData[pPg-
38000 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
38010 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  ];.  u8 * const 
38020 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b  pStart = &aData[
38030 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  pPg->hdrOffset +
38040 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50   8 + pPg->childP
38050 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e  trSize];.  int n
38060 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Ret = 0;.  int i
38070 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  ;.  int iEnd = i
38080 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20  First + nCell;. 
38090 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
380a0 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30    int szFree = 0
380b0 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  ;..  for(i=iFirs
380c0 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b  t; i<iEnd; i++){
380d0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
380e0 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
380f0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
38100 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
38110 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29 20  , pStart, pEnd) 
38120 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  ){.      int sz;
38130 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  .      /* No nee
38140 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64 43  d to use cachedC
38150 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20  ellSize() here. 
38160 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c   The sizes of al
38170 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20  l cells that.   
38180 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20     ** are to be 
38190 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65 61  freed have alrea
381a0 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e  dy been computin
381b0 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67  g while deciding
381c0 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
381d0 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69  cells need freei
381e0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d  ng */.      sz =
381f0 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c   pCArray->szCell
38200 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a  [i];  assert( sz
38210 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
38220 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20  pFree!=(pCell + 
38230 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  sz) ){.        i
38240 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
38250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
38260 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
38270 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
38280 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  36 );.          
38290 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28  freeSpace(pPg, (
382a0 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61  u16)(pFree - aDa
382b0 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20  ta), szFree);.  
382c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
382d0 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
382e0 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20         szFree = 
382f0 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  sz;.        if( 
38300 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20  pFree+sz>pEnd ) 
38310 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
38320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
38330 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
38340 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20        szFree += 
38350 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
38360 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a    nRet++;.    }.
38370 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20    }.  if( pFree 
38380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
38390 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
383a0 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
383b0 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53  536 );.    freeS
383c0 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28  pace(pPg, (u16)(
383d0 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20  pFree - aData), 
383e0 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  szFree);.  }.  r
383f0 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f  eturn nRet;.}../
38400 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  *.** apCell[] an
38410 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  d szCell[] conta
38420 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
38430 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  and sizes of all
38440 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a   cells in the.**
38450 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
38460 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72  anced.  The curr
38470 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c