/ Hex Artifact Content
Login

Artifact 2781fb1db1e46390a9c27a2162395f371577ac66:


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 69 66 28 20 70      */.    if( p
13f70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
13f80 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13f90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13fa0 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
13fb0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
13fc0 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   1;.      MUTEX_
13fd0 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
13fe0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
13ff0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14000 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
14010 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
14020 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14030 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
14040 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
14050 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
14060 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
14070 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14080 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
14090 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
140a0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
140b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
140c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
140d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
140e0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
140f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14110 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
14120 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
14130 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
14140 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14150 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14160 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
14170 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14180 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14190 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
141a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
141b0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
141c0 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
141d0 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
141e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
141f0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14200 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14210 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
14220 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
14230 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
14240 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
14250 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
14260 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
14270 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
14280 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
14290 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
142a0 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
142b0 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
142c0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
142d0 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
142e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
142f0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14300 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
14310 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
14320 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14340 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
14350 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
14360 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
14370 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14380 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
14390 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
143a0 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
143b0 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70  (uptr)p->pBt<(up
143c0 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  tr)pSib->pBt ){.
143d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
143e0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
143f0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
14400 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
14410 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
14420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14430 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
14440 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70  ib->pNext && (up
14450 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  tr)pSib->pNext->
14460 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74  pBt<(uptr)p->pBt
14470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14480 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
14490 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
144a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
144b0 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
144c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
144d0 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
144e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
144f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
14500 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14510 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
14520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
14530 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
14540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14560 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14570 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
14580 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
14590 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
145a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
145b0 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
145c0 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
145d0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
145e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
145f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
14600 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
14610 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
14620 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
14630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
14640 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
14650 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
14660 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
14670 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14680 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
14690 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
146a0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
146b0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
146c0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
146d0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
146e0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
146f0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
14700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14710 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
14720 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
14730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14740 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
14750 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
14760 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14770 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
14780 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
14790 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
147a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
147b0 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
147c0 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
147d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
147e0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
147f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14800 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
14810 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
14820 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
14830 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
14840 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
14850 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
14860 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
14870 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
14880 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
14890 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
148a0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
148b0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
148c0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
148d0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
148e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
148f0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
14900 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
14910 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
14920 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14930 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
14940 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
14950 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
14960 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
14970 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
14980 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
14990 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
149a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
149b0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
149c0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
149d0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
149e0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
149f0 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
14a00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14a10 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
14a20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
14a30 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
14a40 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
14a50 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14a60 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14a70 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
14a80 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14a90 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14aa0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
14ab0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
14ac0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
14ad0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14ae0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14af0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14b00 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
14b10 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
14b20 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
14b30 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
14b40 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
14b50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
14b60 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
14b70 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
14b80 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
14b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ba0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
14bb0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
14bc0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14bd0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
14be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
14bf0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
14c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14c10 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
14c20 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
14c30 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
14c40 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14c50 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
14c60 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
14c70 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
14c80 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
14c90 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
14ca0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
14cb0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
14cc0 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
14cd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
14ce0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
14cf0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
14d00 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
14d10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14d20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14d30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14d40 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
14d50 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
14d60 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
14d70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14d80 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
14d90 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
14da0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
14db0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
14dc0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
14dd0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
14de0 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
14df0 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
14e00 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
14e10 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
14e20 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
14e30 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
14e40 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
14e50 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
14e60 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
14e70 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
14e80 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
14e90 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
14ea0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
14eb0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
14ec0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
14ed0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
14ee0 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
14ef0 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
14f00 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
14f10 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
14f20 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
14f30 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
14f40 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
14f50 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
14f60 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
14f70 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
14f80 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
14f90 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
14fa0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
14fb0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
14fc0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
14fd0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
14fe0 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
14ff0 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
15000 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
15010 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
15020 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
15030 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
15040 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
15050 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
15060 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
15070 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
15080 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
15090 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
150a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
150b0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
150c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
150d0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
150e0 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
150f0 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
15100 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
15110 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
15120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15130 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
15140 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
15150 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15160 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
15170 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15180 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
15190 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
151a0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
151b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
151c0 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
151d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
151e0 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
151f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
15200 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
15210 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
15220 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
15230 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
15240 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
15250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15260 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
15270 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
15280 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
15290 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
152a0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
152b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
152c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
152d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
152e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
152f0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
15300 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
15310 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
15320 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
15330 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
15340 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15350 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
15360 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
15370 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15380 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
15390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
153a0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
153b0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
153c0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
153d0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
153e0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
153f0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
15400 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
15410 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
15420 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
15430 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
15440 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15450 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
15460 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
15470 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
15480 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
15490 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
154a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
154b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
154c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
154d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
154e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
154f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
15500 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
15510 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
15520 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
15530 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
15540 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
15550 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
15560 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
15570 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
15580 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
15590 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
155a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
155b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
155c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
155d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
155e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
155f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
15600 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
15610 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
15620 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15640 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
15650 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
15660 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15670 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15680 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
15690 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
156a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
156b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
156c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
156d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
156e0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
156f0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
15700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
15710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15720 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
15730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15740 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
15750 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
15760 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
15770 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
15780 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
15790 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
157a0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
157b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
157c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
157d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
157e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
157f0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
15800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15810 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15820 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
15830 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15840 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
15850 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
15860 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
15870 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
15880 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
15890 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
158a0 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
158b0 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
158c0 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
158d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
158e0 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
158f0 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
15900 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
15910 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
15920 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
15930 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
15940 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
15950 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
15960 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
15970 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15990 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
159a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
159b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
159c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
159d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
159e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
159f0 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
15a00 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15a10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15a20 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15a40 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15a50 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
15a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15a70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
15a80 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
15a90 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
15aa0 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
15ab0 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
15ac0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
15ad0 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
15ae0 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
15af0 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
15b00 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
15b10 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
15b20 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
15b30 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
15b40 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
15b50 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
15b60 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
15b70 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
15b80 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
15b90 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
15ba0 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
15bb0 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
15bc0 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
15bd0 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
15be0 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15bf0 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
15c00 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
15c10 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
15c20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15c30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c40 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
15c50 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
15c60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15c70 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15c80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15c90 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
15ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15cb0 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
15cc0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15ce0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15cf0 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
15d00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15d10 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
15d20 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
15d30 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
15d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
15d50 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
15d60 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
15d70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15d80 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
15d90 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
15da0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
15db0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15dc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15dd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15de0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15df0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15e00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15e10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
15e20 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
15e30 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
15e40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15e50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15e60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
15e80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
15e90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ea0 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
15eb0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
15ec0 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
15ed0 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
15ee0 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
15ef0 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
15f00 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
15f10 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
15f20 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
15f30 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
15f40 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
15f50 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
15f60 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
15f70 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
15f80 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
15f90 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
15fa0 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
15fb0 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
15fc0 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
15fd0 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
15fe0 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
15ff0 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
16000 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
16010 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
16020 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
16030 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
16040 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
16050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16060 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
16070 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16080 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
16090 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
160a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
160b0 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
160c0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
160d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
160e0 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
160f0 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
16100 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
16110 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16120 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16140 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
16150 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16160 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
16170 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
16180 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
16190 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
161a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
161b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
161c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
161d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
161e0 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
161f0 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
16200 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16210 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
16220 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
16230 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
16240 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
16250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
16260 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
16270 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
16280 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
16290 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
162a0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
162b0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
162c0 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
162d0 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
162e0 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
162f0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
16300 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
16310 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
16320 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
16330 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
16340 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
16350 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
16360 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
16370 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
16380 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
16390 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
163a0 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
163b0 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
163c0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
163d0 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
163e0 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
163f0 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
16400 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16410 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
16420 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
16430 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
16440 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
16450 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16460 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
16470 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
16480 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
16490 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
164a0 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
164b0 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
164c0 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
164d0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
164e0 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
164f0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
16500 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
16510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16520 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
16530 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
16540 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
16550 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
16560 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16570 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
16580 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16590 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
165a0 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
165b0 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
165c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
165d0 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
165e0 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
165f0 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
16600 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
16610 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
16620 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
16630 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
16640 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
16650 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
16660 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16670 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
16680 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
16690 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
166a0 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
166b0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
166c0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
166d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
166e0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
166f0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
16700 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
16710 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
16720 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
16730 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
16740 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
16750 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
16760 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
16770 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
16780 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
16790 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
167a0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
167b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
167c0 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
167d0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
167e0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
167f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16800 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
16810 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
16820 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
16830 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
16840 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
16850 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
16860 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
16870 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16880 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16890 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
168a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
168b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
168c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
168d0 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
168e0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
168f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16900 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16910 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
16920 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
16930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16940 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
16950 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
16960 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
16970 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
16980 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
16990 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
169a0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
169b0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
169c0 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
169d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
169e0 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
169f0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
16a00 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
16a10 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
16a20 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
16a30 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
16a40 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
16a50 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
16a60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
16a70 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
16a80 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
16a90 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
16aa0 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
16ab0 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
16ac0 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
16ad0 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
16ae0 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
16af0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16b00 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
16b10 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
16b20 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
16b30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b40 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
16b50 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
16b60 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
16b70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16b80 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
16b90 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
16ba0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
16bb0 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
16bc0 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
16bd0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
16be0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16bf0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
16c00 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
16c10 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
16c20 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
16c30 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
16c40 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
16c50 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
16c60 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
16c70 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
16c80 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
16c90 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
16ca0 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
16cb0 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
16cc0 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
16cd0 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
16ce0 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
16cf0 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
16d00 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
16d10 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
16d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16d30 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
16d40 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
16d50 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16d60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16d70 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
16d80 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
16d90 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
16da0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16db0 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
16dc0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16dd0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
16de0 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
16df0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
16e00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e10 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
16e20 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
16e30 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
16e40 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
16e50 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
16e60 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
16e70 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
16e80 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
16e90 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
16ea0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
16eb0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
16ec0 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
16ed0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
16ee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
16ef0 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
16f00 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
16f10 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
16f20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16f30 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
16f40 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
16f50 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
16f60 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
16f70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16f80 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
16f90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
16fa0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16fb0 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
16fc0 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
16fd0 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
16fe0 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
16ff0 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
17000 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
17010 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
17020 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
17030 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
17040 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
17050 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
17060 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
17070 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17080 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17090 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
170a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
170b0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
170c0 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
170d0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
170e0 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
170f0 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
17100 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
17110 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17120 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
17130 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
17140 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17150 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17160 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
17170 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17180 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
17190 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
171a0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
171b0 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
171c0 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
171d0 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
171e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
171f0 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
17200 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
17210 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
17220 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
17230 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
17240 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
17250 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
17260 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
17270 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
17280 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
17290 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
172a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
172b0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
172c0 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
172d0 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
172e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
172f0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
17300 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17310 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
17320 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17340 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
17350 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
17360 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17370 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
17380 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17390 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
173a0 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
173b0 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
173c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
173d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
173e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
173f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
17400 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
17410 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
17420 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
17430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17440 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17450 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
17460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17470 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
17480 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
17490 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
174a0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
174b0 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
174c0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
174d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
174e0 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
174f0 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
17500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17510 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
17520 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
17530 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
17540 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17550 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17560 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
17570 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
17580 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
17590 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
175a0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
175b0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
175c0 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
175d0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
175e0 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
175f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17600 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17610 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
17620 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
17630 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
17640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17650 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
17660 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
17670 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
17680 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
17690 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
176a0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
176b0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
176c0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
176d0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
176e0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
176f0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
17700 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
17710 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17720 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17730 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
17740 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
17750 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
17760 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
17770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
17780 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
17790 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
177c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
177d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
177e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
177f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
17800 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
17810 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
17820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
17830 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
17840 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
17850 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
17860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17870 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17880 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17890 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
178a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
178b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
178c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
178d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
178e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
178f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17910 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
17920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17930 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
17940 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
17950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17960 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17970 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17980 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
17990 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
179a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
179b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
179c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
179d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
179e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
179f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
17a00 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
17a10 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
17a20 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
17a30 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
17a40 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17a50 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
17a60 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17a70 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
17a80 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
17a90 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
17aa0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
17ab0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
17ac0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
17ad0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
17ae0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
17af0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
17b00 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
17b10 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
17b20 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
17b30 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
17b40 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
17b50 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17b60 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17b70 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
17b80 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
17b90 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
17ba0 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
17bb0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
17bc0 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
17bd0 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
17be0 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
17bf0 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
17c00 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
17c10 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
17c20 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
17c30 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
17c40 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17c50 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17c60 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17c70 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
17c80 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
17c90 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
17ca0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
17cb0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
17cc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17cd0 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
17ce0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17cf0 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
17d00 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
17d10 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
17d20 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17d30 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
17d40 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
17d50 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
17d60 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17d70 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
17d80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
17d90 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
17da0 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
17db0 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
17dc0 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
17dd0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
17de0 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
17df0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
17e00 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
17e10 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
17e20 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
17e30 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
17e40 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
17e50 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
17e60 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
17e70 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
17e80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
17e90 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
17ea0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
17eb0 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
17ec0 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
17ed0 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
17ee0 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
17ef0 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
17f00 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
17f10 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
17f20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
17f30 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
17f40 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
17f50 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
17f60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
17f70 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
17f80 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
17f90 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
17fa0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
17fb0 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
17fc0 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
17fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17fe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
17ff0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18000 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18010 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  {.#if SQLITE_DEF
18020 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18030 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
18040 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
18050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18060 20 2a 64 62 3b 0a 20 20 20 20 20 20 20 20 44 62   *db;.        Db
18070 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 20 20 69   *pDb;.        i
18080 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18090 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
180a0 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
180b0 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
180c0 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
180d0 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
180e0 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  pDb++; }.       
180f0 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e     if( pDb->bSyn
18100 63 53 65 74 3d 3d 30 0a 20 20 20 20 20 20 20 20  cSet==0.        
18110 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
18120 79 5f 6c 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f  y_level==SQLITE_
18130 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18140 4f 55 53 2b 31 0a 20 20 20 20 20 20 20 20 20 20  OUS+1.          
18150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
18160 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18170 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18180 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
18190 53 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S+1;.           
181a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
181b0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
181c0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
181d0 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
181e0 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
181f0 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18200 41 53 4b 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ASK));.         
18210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
18220 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
18230 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
18240 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18250 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18260 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18270 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18280 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
182a0 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
182b0 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
182c0 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
182d0 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
182e0 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
182f0 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
18300 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
18310 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
18320 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
18330 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
18340 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
18350 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
18360 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
18370 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18380 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18390 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
183a0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
183b0 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
183c0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
183d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
183e0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
183f0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
18400 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18410 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18420 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
18430 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
18440 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
18450 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
18460 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
18470 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18480 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
18490 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
184a0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
184b0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
184c0 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
184d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
184e0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
184f0 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
18500 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
18510 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
18520 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18530 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
18540 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
18550 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
18560 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
18570 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
18580 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
18590 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
185a0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
185b0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
185c0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
185d0 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
185e0 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
185f0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
18600 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18610 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
18620 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
18630 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
18640 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18650 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
18660 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
18670 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
18680 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
18690 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
186a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
186b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
186c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
186d0 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
186e0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
186f0 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
18700 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
18710 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
18720 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
18730 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
18740 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
18750 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
18760 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
18770 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
18780 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
18790 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
187a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
187b0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
187c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
187d0 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
187e0 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
187f0 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
18800 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
18810 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
18820 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
18830 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18840 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
18850 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
18860 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
18870 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
18880 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
18890 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
188a0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
188b0 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
188c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
188d0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
188e0 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
188f0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
18900 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
18910 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
18920 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
18930 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
18940 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
18950 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
18960 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18970 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18980 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18990 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
189a0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
189b0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
189c0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
189d0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
189e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
189f0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
18a00 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
18a10 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
18a40 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
18a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18a70 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
18a80 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
18a90 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
18aa0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
18ab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ac0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18ad0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18ae0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18af0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18b00 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
18b10 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
18b20 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
18b30 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
18b40 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
18b50 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
18b60 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
18b70 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
18b80 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
18b90 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
18ba0 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
18bb0 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
18bc0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
18bd0 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
18be0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18bf0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
18c00 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
18c10 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
18c20 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18c30 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
18c40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18c50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
18c60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
18c70 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18c80 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
18c90 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
18ca0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18cb0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
18cc0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
18cd0 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
18ce0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
18cf0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
18d00 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
18d10 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
18d20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
18d30 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
18d40 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
18d50 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
18d60 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
18d70 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
18d80 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
18d90 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
18da0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
18db0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
18dc0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
18dd0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
18de0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
18df0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
18e00 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
18e10 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
18e20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
18e30 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18e40 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
18e50 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
18e60 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
18e70 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
18e80 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
18e90 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
18ea0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
18eb0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
18ec0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
18ed0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
18ee0 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
18ef0 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
18f00 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
18f10 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
18f20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
18f30 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
18f40 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18f50 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
18f60 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
18f70 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
18f80 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
18f90 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
18fa0 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
18fb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18fc0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
18fd0 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
18fe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
18ff0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19000 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
19010 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
19020 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19030 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
19040 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
19050 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
19060 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
19070 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
19080 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
19090 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
190a0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
190b0 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
190c0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
190d0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
190e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
190f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
19100 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19110 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
19120 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
19130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
19140 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
19150 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19160 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
19170 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
19180 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
19190 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
191a0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
191b0 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
191c0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
191d0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
191e0 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
191f0 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
19200 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
19210 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
19220 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
19230 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
19240 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
19250 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
19260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
19270 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
19280 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
19290 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
192a0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
192b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
192c0 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
192d0 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
192e0 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
192f0 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
19300 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
19310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
19320 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
19330 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
19340 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
19350 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
19360 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
19370 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
19380 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
19390 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
193a0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
193b0 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
193c0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
193d0 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
193e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
193f0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
19400 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
19410 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
19420 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
19430 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
19440 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
19450 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
19460 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
19470 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
19480 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
19490 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
194a0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
194b0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
194c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194e0 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
194f0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
19500 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
19510 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
19520 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
19530 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
19540 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
19550 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
19560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
19570 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19580 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
195a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
195b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
195c0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
195d0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
195e0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
195f0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
19600 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
19610 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19620 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
19630 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
19640 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
19650 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
19660 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
19670 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
19680 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19690 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
196a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
196b0 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
196c0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
196d0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
196e0 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
196f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
19700 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
19710 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
19720 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
19730 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
19740 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
19750 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
19760 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19770 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19790 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
197a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
197b0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
197c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
197d0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
197e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
197f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
19810 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
19820 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19830 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
19840 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
19850 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
19860 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
19870 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
19880 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19890 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
198a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
198b0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
198c0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
198d0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
198e0 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
198f0 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
19900 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
19910 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
19920 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19930 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
19940 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
19950 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
19960 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
19970 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
19980 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
19990 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
199a0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
199b0 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
199c0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
199d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
199e0 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
199f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
19a00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
19a10 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
19a20 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
19a30 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
19a40 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
19a50 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
19a60 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
19a70 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
19a80 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
19a90 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
19aa0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
19ab0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
19ac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ad0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
19ae0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
19af0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
19b00 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
19b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19b20 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
19b30 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
19b40 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
19b50 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
19b60 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
19b70 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
19b80 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
19b90 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
19ba0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
19bb0 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
19bc0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
19bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
19bf0 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
19c00 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19c10 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
19c20 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
19c30 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
19c40 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
19c50 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
19c60 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
19c70 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
19c80 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
19c90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19ca0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
19cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
19cc0 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
19cd0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19ce0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19cf0 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
19d00 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
19d10 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
19d20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19d30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19d50 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
19d60 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19d70 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
19d80 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
19d90 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
19da0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19db0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
19dc0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
19dd0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
19de0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19df0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
19e00 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
19e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19e20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
19e30 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
19e40 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
19e50 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
19e60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
19e70 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
19e80 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
19e90 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
19ea0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
19eb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
19ec0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
19ed0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
19ee0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
19ef0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
19f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19f10 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
19f20 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
19f30 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
19f40 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
19f50 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
19f60 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
19f70 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19f80 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
19f90 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
19fa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
19fb0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
19fc0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
19fd0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
19fe0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19ff0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1a000 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1a010 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1a020 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a030 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1a040 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a050 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1a060 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1a070 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1a080 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a090 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1a0a0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1a0b0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1a0c0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1a0d0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1a0e0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1a0f0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1a100 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1a110 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1a120 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1a130 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1a140 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1a150 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1a160 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1a170 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1a180 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1a190 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1a1a0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1a1b0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1a1c0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1a1d0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1a1e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1a1f0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1a200 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1a210 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1a220 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1a230 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1a240 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1a250 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1a260 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1a270 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1a280 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1a290 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1a2a0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1a2b0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1a2c0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1a2d0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1a2e0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1a2f0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1a300 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1a310 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1a320 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1a330 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1a340 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1a350 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1a360 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1a370 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1a380 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1a390 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1a3a0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1a3b0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1a3c0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1a3d0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1a3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a3f0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1a400 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1a410 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
1a420 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a430 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a440 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1a450 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1a460 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1a470 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1a480 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1a490 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1a4a0 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1a4b0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1a4c0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a4d0 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1a4e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1a4f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1a500 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1a510 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1a520 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a530 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1a540 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1a550 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1a560 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a570 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a580 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a590 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a5a0 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1a5b0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1a5c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1a5d0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1a5e0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1a5f0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1a600 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1a610 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a620 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a630 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1a640 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a650 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a660 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a670 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1a680 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a690 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1a6a0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1a6b0 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1a6c0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1a6d0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1a6e0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1a6f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1a700 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1a710 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1a720 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1a730 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1a740 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1a750 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1a760 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1a770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1a780 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1a790 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a7a0 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1a7b0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1a7c0 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1a7d0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1a7e0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1a7f0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1a800 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1a810 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1a820 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1a830 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1a840 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1a850 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1a860 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a870 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1a880 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1a890 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1a8a0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1a8b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a8c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a8d0 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1a8e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a8f0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1a900 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1a910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1a920 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1a930 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1a940 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a950 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a960 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1a970 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1a980 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1a990 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1a9a0 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1a9b0 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1a9c0 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1a9d0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1a9e0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1a9f0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1aa00 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1aa10 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1aa20 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1aa30 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1aa40 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1aa50 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1aa60 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1aa70 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1aa80 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1aa90 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1aaa0 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1aab0 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1aac0 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1aad0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1aae0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1aaf0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1ab00 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1ab10 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1ab20 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1ab30 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1ab40 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1ab50 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ab60 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1ab70 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ab80 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ab90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1aba0 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1abb0 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1abc0 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1abd0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1abe0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1abf0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1ac00 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ac10 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1ac20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1ac30 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1ac40 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1ac50 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1ac60 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1ac70 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1ac80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1ac90 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1aca0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1acb0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1acc0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1acd0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1ace0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1acf0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1ad00 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1ad10 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1ad20 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1ad30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1ad40 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1ad50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1ad60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1ad70 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1ad80 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1ad90 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1ada0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1adb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1add0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1ade0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1adf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1ae00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ae10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1ae20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1ae30 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1ae40 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1ae50 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1ae60 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1ae70 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1ae80 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1ae90 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1aea0 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
1aeb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aec0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1aed0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1aee0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1aef0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1af00 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1af10 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1af20 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1af30 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1af40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1af50 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1af60 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1af70 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1af80 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1af90 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1afa0 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1afb0 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1afc0 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1afd0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1afe0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1aff0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1b000 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1b010 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1b020 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1b030 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1b040 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1b050 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b060 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1b070 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1b080 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1b090 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b0a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b0b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b0c0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1b0d0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1b0e0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1b0f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1b100 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1b110 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b120 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1b130 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1b140 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1b150 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1b160 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1b170 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1b180 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1b190 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1b1a0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1b1b0 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1b1c0 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1b1d0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1b1e0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1b1f0 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1b200 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1b210 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1b220 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1b230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b240 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1b250 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1b260 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1b270 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1b280 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1b290 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1b2a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1b2b0 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1b2c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b2d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1b2e0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1b2f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b300 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1b310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b320 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1b330 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b360 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1b370 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1b380 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1b390 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b3a0 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
1b3b0 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
1b3c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1b3d0 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
1b3e0 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1b3f0 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1b400 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1b410 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1b420 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1b430 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1b440 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1b450 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1b460 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
1b470 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1b480 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1b490 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1b4a0 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
1b4b0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b4c0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b4d0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b4e0 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
1b4f0 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
1b500 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b520 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b530 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b550 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1b560 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1b570 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1b580 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1b590 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1b5a0 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1b5b0 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1b5c0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1b5d0 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1b5e0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1b5f0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1b600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1b610 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1b620 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1b630 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1b640 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b670 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1b680 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b6b0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1b6c0 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1b6d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b700 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1b710 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1b720 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
1b730 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1b740 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1b750 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1b760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b770 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1b780 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1b790 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
1b7a0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1b7b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b7c0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
1b7d0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
1b7e0 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
1b7f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b800 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1b810 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1b820 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1b830 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1b840 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1b850 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1b860 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1b870 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1b880 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1b890 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1b8a0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1b8b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1b8c0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1b8d0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1b8e0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1b8f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1b900 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1b910 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1b920 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b930 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b940 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1b950 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b960 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b970 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b980 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
1b990 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
1b9a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1b9b0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
1b9c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b9d0 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1b9e0 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1b9f0 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1ba00 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1ba10 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1ba20 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1ba30 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1ba40 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1ba50 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1ba60 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1ba70 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1ba80 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1ba90 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1baa0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1bab0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bac0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1baf0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bb00 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1bb10 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1bb20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bb30 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1bb40 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1bb50 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1bb60 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1bb70 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1bb80 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1bb90 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1bba0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1bbb0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1bbc0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1bbd0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1bbf0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1bc00 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1bc10 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1bc20 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1bc30 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1bc40 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1bc50 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1bc60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1bc70 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1bc80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1bc90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1bca0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1bcb0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1bcc0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1bcd0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1bce0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1bcf0 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1bd00 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1bd10 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1bd20 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1bd30 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1bd40 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1bd50 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1bd60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1bd70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1bd80 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1bd90 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
1bda0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
1bdb0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1bdc0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
1bdd0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1bde0 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1bdf0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
1be00 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1be10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1be20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1be30 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1be40 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1be50 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1be60 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1be70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1be80 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1be90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1bea0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1beb0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1bec0 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1bed0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1bee0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1bef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1bf00 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1bf10 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20 20  nPayload.       
1bf20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1bf30 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e  nSize-1<=pPage->
1bf40 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
1bf50 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
1bf60 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
1bf70 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1bf80 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29 7b  ze-4).        ){
1bf90 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1bfa0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1bfb0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1bfc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bfe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1bff0 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1c000 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1c010 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1c020 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1c030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c050 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c060 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1c070 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1c080 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1c090 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1c0a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c0b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c0c0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1c0d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c0e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c0f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c100 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1c110 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c120 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1c130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1c140 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1c150 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
1c160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c170 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1c180 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1c190 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1c1a0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1c1b0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1c1c0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1c1d0 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1c1e0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1c1f0 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1c200 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1c210 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1c220 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1c230 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1c240 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1c250 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1c260 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1c270 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1c280 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1c290 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1c2a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1c2b0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1c2c0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1c2d0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1c2e0 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1c2f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1c310 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1c320 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1c330 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1c340 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1c350 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1c360 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c370 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1c380 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c390 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1c3b0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1c3c0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1c3d0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c3e0 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1c3f0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1c400 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1c410 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1c420 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1c430 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1c440 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1c450 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c460 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1c470 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1c480 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1c490 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1c4a0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1c4b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1c4c0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1c4d0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1c4e0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1c4f0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1c500 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1c510 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1c520 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c530 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1c540 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1c550 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c560 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c570 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1c580 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c590 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1c5b0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1c5c0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1c5d0 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1c5e0 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1c5f0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1c600 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1c610 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1c620 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1c630 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1c640 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1c650 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1c660 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1c670 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1c680 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1c690 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1c6a0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1c6b0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1c6c0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1c6d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c6f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1c700 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1c710 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1c720 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1c730 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1c740 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1c750 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1c760 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1c770 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1c780 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1c790 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1c7a0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1c7b0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1c7c0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1c7d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1c7e0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1c7f0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1c800 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1c810 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1c820 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1c830 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1c840 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1c850 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1c860 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1c870 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1c880 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1c890 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1c8a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1c8b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1c8c0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1c8d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1c8e0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1c8f0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1c900 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1c910 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c920 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1c930 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1c940 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1c950 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1c960 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1c970 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1c980 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1c990 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1c9a0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1c9b0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1c9c0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1c9d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c9e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1c9f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ca00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1ca10 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1ca20 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1ca30 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1ca40 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1ca50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1ca60 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1ca70 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1ca80 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1ca90 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1caa0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1cab0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1cac0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1cad0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cae0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1caf0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1cb00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1cb10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cb30 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1cb40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1cb50 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1cb60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1cb90 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1cba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cbb0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1cbc0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1cbd0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1cbe0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1cbf0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1cc00 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1cc10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cc20 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1cc30 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1cc40 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1cc50 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1cc60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1cc70 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1cc80 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1cc90 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1cca0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1ccb0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1ccc0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1ccd0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1cce0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1ccf0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1cd00 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1cd10 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1cd20 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1cd30 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1cd40 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1cd50 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1cd60 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1cd70 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1cd80 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1cd90 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1cda0 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1cdb0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1cdc0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1cdd0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1cde0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1cdf0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1ce00 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1ce10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1ce20 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1ce30 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1ce40 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1ce50 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1ce60 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1ce70 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1ce80 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1ce90 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1cea0 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1ceb0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1cec0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1ced0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1cee0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1cef0 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1cf00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cf10 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1cf20 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1cf30 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1cf40 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1cf50 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1cf60 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1cf70 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1cf80 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1cf90 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1cfa0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1cfb0 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1cfc0 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1cfd0 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1cfe0 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1cff0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1d000 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1d010 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d020 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1d030 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1d040 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1d050 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1d060 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1d070 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1d080 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1d090 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d0a0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1d0b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1d0c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1d0d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d0e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d0f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d100 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1d110 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1d120 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1d130 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1d140 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d150 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1d160 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1d170 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1d180 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1d190 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d1a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d1b0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1d1c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1d1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1d1e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1d1f0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d200 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1d210 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1d220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1d240 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d250 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d260 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d280 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d2a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1d2b0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1d2c0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1d2d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1d2e0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1d2f0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1d300 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1d310 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1d320 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1d330 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1d340 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1d350 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1d360 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1d370 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1d380 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1d390 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1d3a0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1d3b0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1d3c0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1d3d0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1d3e0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1d3f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1d400 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1d410 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1d420 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1d430 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1d440 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1d450 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1d460 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1d470 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1d480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d4a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d4b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1d4c0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1d4d0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1d4e0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1d4f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d500 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1d510 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1d520 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d530 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1d540 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1d550 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1d560 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1d570 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1d580 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1d590 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1d5a0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d5b0 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1d5c0 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1d5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1d5e0 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1d5f0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d600 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1d610 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1d620 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1d630 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1d640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d670 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1d680 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1d690 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1d6a0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1d6b0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1d6c0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1d6d0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1d6e0 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1d6f0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1d700 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1d710 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1d720 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1d730 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1d740 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1d750 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1d760 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1d770 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1d780 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1d790 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1d7a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1d7b0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1d7c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1d7d0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1d7e0 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1d7f0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1d800 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1d810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1d820 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1d830 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1d840 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1d850 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1d860 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1d870 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1d880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d8a0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1d8b0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1d8c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d8d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d8e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d8f0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1d900 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1d910 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1d920 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1d930 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1d940 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1d950 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1d960 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1d970 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1d980 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1d990 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1d9a0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1d9b0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1d9c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d9d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d9f0 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1da00 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1da10 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1da20 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1da30 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1da40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1da50 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1da60 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1da70 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1da80 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1da90 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1daa0 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1dab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dac0 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1dad0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1dae0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1daf0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1db00 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1db10 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1db20 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1db30 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1db40 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1db50 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1db60 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1db70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1db80 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1db90 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1dba0 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1dbb0 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1dbc0 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1dbd0 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1dbe0 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc00 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1dc10 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1dc20 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1dc30 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1dc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dc50 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1dc60 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1dc70 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1dca0 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1dcb0 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1dcc0 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1dcd0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1dce0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1dcf0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1dd00 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1dd10 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1dd20 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1dd30 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1dd40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dd50 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1dd60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1dd70 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1dd80 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1dd90 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1dda0 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1ddb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ddc0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1ddd0 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1dde0 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1ddf0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1de00 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1de10 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1de20 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1de30 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1de40 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1de50 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1de60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1de70 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1de80 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1de90 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1dea0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1deb0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1dec0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1ded0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1dee0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1def0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1df00 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1df10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1df20 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1df30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1df40 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1df50 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1df60 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1df70 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1df80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1df90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dfa0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1dfb0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1dfc0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1dfd0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1dfe0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1dff0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1e000 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e010 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1e020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1e030 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1e040 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e050 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1e060 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e070 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e080 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1e090 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e0a0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e0b0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1e0c0 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1e0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1e0e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e0f0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1e100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e110 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1e120 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1e130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1e150 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e160 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1e170 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1e180 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1e190 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1e1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e1b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e1c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e1d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e1e0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e1f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e200 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e210 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1e220 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1e230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e240 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1e250 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1e260 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1e270 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e2a0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1e2b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1e2c0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1e2d0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1e2e0 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1e2f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e300 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1e310 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e320 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1e330 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1e340 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e350 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1e360 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1e370 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1e380 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1e390 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1e3a0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1e3b0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1e3c0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1e3d0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1e3e0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1e3f0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1e400 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1e410 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1e420 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1e430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e440 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e450 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1e460 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1e470 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1e480 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e490 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1e4a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e4b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e4c0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1e4d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1e4e0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1e4f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1e500 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1e510 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1e520 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1e530 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e540 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1e550 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1e560 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1e570 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1e580 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e590 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1e5a0 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1e5b0 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1e5c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1e5d0 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1e5e0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1e5f0 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1e600 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1e610 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1e620 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1e630 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e640 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1e650 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1e660 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1e670 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e680 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1e690 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1e6a0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1e6b0 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1e6c0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1e6d0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1e6e0 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1e6f0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1e700 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1e710 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1e720 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1e730 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1e740 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e750 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1e760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e780 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1e790 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e7a0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e7b0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1e7c0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1e7d0 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1e7e0 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1e7f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e800 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1e810 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1e820 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1e830 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1e840 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1e850 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1e860 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1e870 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1e880 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1e890 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1e8a0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1e8b0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1e8c0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1e8d0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1e8e0 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1e8f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e900 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e910 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e920 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1e930 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1e940 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e950 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1e960 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e970 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1e980 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e990 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e9a0 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1e9b0 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1e9c0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1e9d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1e9e0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1e9f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ea00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ea10 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1ea20 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ea30 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1ea40 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1ea50 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1ea60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ea70 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1ea80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ea90 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1eaa0 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1eab0 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1eac0 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1ead0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1eae0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1eaf0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1eb00 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1eb10 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1eb20 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1eb30 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1eb40 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1eb50 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1eb60 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1eb70 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1eb80 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1eb90 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1eba0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1ebb0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1ebc0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1ebd0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1ebe0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1ebf0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1ec00 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1ec10 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1ec20 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1ec30 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1ec40 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1ec50 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1ec60 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1ec70 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1ec80 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1ec90 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1eca0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1ecb0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1ecc0 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1ecd0 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1ece0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ecf0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1ed00 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1ed10 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1ed20 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1ed30 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1ed40 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1ed50 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1ed60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1ed70 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1ed80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1ed90 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1eda0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1edb0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1edc0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1edd0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1ede0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1edf0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1ee00 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1ee10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ee20 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1ee30 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1ee40 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1ee50 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1ee60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1ee70 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1ee80 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1ee90 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1eea0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1eeb0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1eec0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1eed0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1eee0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1eef0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1ef00 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1ef10 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1ef20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1ef30 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1ef40 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1ef50 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1ef60 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1ef70 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1ef80 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1ef90 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1efa0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1efb0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1efc0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1efd0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1efe0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1eff0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1f000 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1f010 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1f020 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f030 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1f040 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1f050 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1f060 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f070 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1f080 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f090 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f0a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f0b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1f0c0 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1f0d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f0e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f0f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1f110 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1f120 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1f130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1f150 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1f160 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f180 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1f190 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1f1a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1f1b0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1f1c0 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1f1d0 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1f1e0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1f1f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f200 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1f210 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1f220 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f230 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1f240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f250 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f260 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1f270 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1f280 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1f290 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1f2a0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1f2b0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1f2c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1f2d0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1f2e0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1f2f0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1f300 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f310 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f320 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1f330 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1f340 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1f350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f360 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1f370 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f380 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1f390 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1f3a0 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1f3b0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1f3c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1f3d0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1f3e0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1f3f0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1f400 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1f410 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1f420 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1f430 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1f440 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1f450 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1f460 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1f470 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1f480 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1f490 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1f4a0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f4b0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f4c0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1f4d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1f4e0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1f4f0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1f500 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1f510 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1f520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f530 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1f540 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1f550 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1f560 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1f570 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1f580 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1f590 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1f5a0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f5b0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1f5c0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1f5d0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1f5e0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1f5f0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1f600 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1f610 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1f620 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1f630 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1f640 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1f650 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1f660 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1f670 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1f680 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f6a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1f6b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1f6c0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1f6d0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1f6e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1f6f0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1f700 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1f710 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1f720 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1f730 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f740 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1f750 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1f760 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1f770 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1f780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1f790 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f7a0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1f7b0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1f7c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1f7d0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1f7e0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1f7f0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1f800 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1f810 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1f820 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1f830 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1f840 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1f850 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1f860 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1f870 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1f880 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f890 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1f8a0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1f8b0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1f8c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1f8d0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1f8e0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1f8f0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1f900 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1f910 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1f920 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1f930 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1f940 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1f950 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1f960 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1f970 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1f980 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1f990 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1f9a0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1f9b0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1f9c0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1f9d0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1f9e0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1f9f0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1fa00 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1fa10 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1fa20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1fa30 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1fa40 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1fa50 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1fa60 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1fa70 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1fa80 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1fa90 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1faa0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1fab0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1fac0 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1fad0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1fae0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1faf0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1fb00 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1fb10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1fb20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fb30 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1fb40 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1fb50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fb60 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1fb70 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1fb80 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1fb90 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1fba0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1fbb0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1fbc0 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1fbd0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1fbe0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1fbf0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1fc00 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1fc10 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1fc20 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1fc30 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1fc40 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1fc50 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1fc60 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1fc70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1fc80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1fc90 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1fca0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1fcb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1fcc0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1fcd0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1fce0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1fcf0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1fd00 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1fd10 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1fd20 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1fd30 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1fd40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1fd50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1fd60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fd70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1fd80 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1fd90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1fda0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1fdb0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1fdc0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1fdd0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1fde0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1fdf0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1fe00 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1fe10 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1fe20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1fe30 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1fe40 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1fe50 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1fe60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1fe70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fe80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1fe90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1fea0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1feb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1fec0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1fed0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1fee0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1fef0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ff00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1ff10 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1ff20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ff30 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1ff40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ff50 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
1ff60 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
1ff70 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
1ff80 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
1ff90 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
1ffa0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1ffb0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
1ffc0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
1ffd0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
1ffe0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1fff0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20000 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20020 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
20030 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
20040 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
20050 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20060 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
20070 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
20080 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
200a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
200b0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
200c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
200d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
200e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
200f0 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
20100 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20110 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
20120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20130 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
20140 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
20150 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
20160 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
20170 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
20180 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
20190 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
201a0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
201b0 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
201c0 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
201d0 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
201e0 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
201f0 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
20200 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
20210 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
20220 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
20230 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
20240 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
20250 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
20260 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
20270 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
20280 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
20290 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
202a0 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
202b0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
202c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
202d0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
202e0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
202f0 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
20300 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
20310 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
20320 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
20330 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
20340 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
20350 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
20360 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
20370 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
20380 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
20390 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
203a0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
203b0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
203c0 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
203d0 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
203e0 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
203f0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20400 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
20410 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
20420 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
20430 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
20440 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
20450 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
20460 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
20470 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
20480 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
20490 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
204a0 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
204b0 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
204c0 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
204d0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
204e0 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
204f0 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
20500 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
20510 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
20520 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
20530 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
20540 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
20550 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
20560 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
20570 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
20580 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
20590 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
205a0 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
205b0 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
205c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
205d0 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
205e0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
205f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
20600 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
20610 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
20620 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
20630 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
20640 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
20650 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
20660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20670 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20680 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
20690 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
206a0 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
206b0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
206c0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
206d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
206e0 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
206f0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
20700 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
20710 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
20720 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
20730 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
20740 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
20750 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
20760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
20770 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20780 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
20790 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
207a0 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
207b0 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
207c0 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
207d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
207e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
207f0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
20800 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20810 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
20820 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
20830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20860 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20870 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
20880 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
20890 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
208a0 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
208b0 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
208c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
208d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
208e0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
208f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20900 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
20910 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
20920 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
20930 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
20940 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
20950 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
20960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20970 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
20980 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
20990 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
209a0 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
209b0 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
209c0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
209d0 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
209e0 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
209f0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
20a00 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20a10 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
20a20 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
20a30 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
20a40 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
20a50 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
20a60 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
20a70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
20a80 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
20a90 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
20aa0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
20ab0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
20ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20ad0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
20ae0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
20af0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
20b00 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
20b10 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
20b20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
20b30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
20b40 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
20b50 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
20b60 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
20b70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
20b80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
20b90 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
20ba0 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
20bb0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
20bc0 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
20bd0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
20be0 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
20bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20c10 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
20c20 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20c30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
20c40 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
20c50 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20c60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20c70 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
20c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20ca0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
20cb0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
20cc0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20cd0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
20ce0 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
20cf0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
20d10 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
20d20 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
20d30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
20d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
20d50 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
20d60 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20d70 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20d80 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20d90 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
20da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
20db0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
20dc0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
20dd0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
20de0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
20df0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
20e00 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
20e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
20e20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
20e30 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
20e40 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
20e50 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
20e60 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
20e70 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
20e80 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
20e90 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
20ea0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
20eb0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
20ec0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
20ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
20ee0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
20ef0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
20f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20f10 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
20f20 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
20f30 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
20f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
20f50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
20f60 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
20f70 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
20f80 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
20f90 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
20fa0 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
20fb0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
20fc0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20fd0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
20fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
20ff0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
21000 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
21010 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
21020 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
21030 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
21040 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
21050 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
21060 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
21070 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
21080 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
21090 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
210a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
210b0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
210c0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
210d0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
210e0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
210f0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
21100 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
21110 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
21120 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
21130 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
21140 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
21150 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
21160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
21170 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
21180 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
21190 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
211a0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
211b0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
211c0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
211d0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
211e0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
211f0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
21200 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
21210 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
21220 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
21230 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
21240 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
21250 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
21260 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
21270 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
21280 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
21290 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
212a0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
212b0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
212c0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
212d0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
212e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
212f0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
21300 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
21310 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
21320 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21330 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
21340 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
21350 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
21360 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
21370 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
21380 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
21390 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
213a0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
213b0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
213c0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
213d0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
213e0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
213f0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
21400 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
21410 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
21420 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
21430 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
21440 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
21450 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
21460 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
21470 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21480 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
21490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
214a0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
214b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
214c0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
214d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
214e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
214f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21500 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
21510 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
21520 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
21530 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
21540 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
21550 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
21560 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
21570 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
21580 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
21590 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
215a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
215b0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
215c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
215d0 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
215e0 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
215f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21600 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
21610 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
21620 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
21630 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
21640 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
21650 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
21660 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
21670 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
21680 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
21690 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
216a0 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
216b0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
216c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
216d0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
216e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
216f0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
21700 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
21710 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
21720 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21730 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21750 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21760 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
21770 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
21780 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
21790 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
217a0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
217b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
217c0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
217d0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
217e0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
217f0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
21800 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
21810 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
21820 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
21830 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
21840 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
21850 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21860 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
21870 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
21880 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
21890 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
218a0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
218b0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
218c0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
218d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
218e0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
218f0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
21900 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
21910 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
21920 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
21930 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
21940 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
21950 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
21960 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
21970 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
21980 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21990 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
219a0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
219b0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
219c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
219d0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
219e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
219f0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
21a00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
21a20 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
21a30 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
21a40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
21a50 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
21a60 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
21a70 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
21a80 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
21a90 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
21aa0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21ab0 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
21ac0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
21ad0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21ae0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
21af0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21b10 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
21b20 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
21b30 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
21b40 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
21b50 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
21b60 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
21b70 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
21b80 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
21b90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
21ba0 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
21bb0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21bc0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
21bd0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21be0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
21bf0 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
21c00 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
21c10 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
21c20 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
21c30 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
21c40 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
21c50 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
21c60 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
21c70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
21c80 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
21c90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21cd0 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
21ce0 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
21cf0 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
21d00 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
21d10 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
21d20 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
21d30 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
21d40 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
21d50 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
21d60 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
21d70 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
21d80 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
21d90 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
21da0 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
21db0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
21dc0 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
21dd0 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
21de0 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
21df0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
21e00 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
21e10 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
21e20 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20  it of wrFlag is 
21e30 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
21e40 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a  cursor can only.
21e50 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ** be used for r
21e60 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20  eading.  If the 
21e70 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
21e80 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
21e90 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62   cursor.** can b
21ea0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21eb0 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ng or for writin
21ec0 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
21ed0 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
21ee0 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65  g.** are also me
21ef0 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68  t.  These are th
21f00 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
21f10 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
21f20 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72   order.** for wr
21f30 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f  iting to be allo
21f40 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
21f50 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
21f60 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
21f70 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74  with wrFlag cont
21f80 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43  aining BTREE_WRC
21f90 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  SR.**.** 2:  Oth
21fa0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21fb0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
21fc0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
21fd0 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
21fe0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
21ff0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
22000 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
22010 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
22020 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
22030 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
22040 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
22050 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
22060 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
22070 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
22080 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
22090 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
220a0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
220b0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
220c0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
220d0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
220e0 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
220f0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
22100 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
22110 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
22120 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
22130 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
22140 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
22150 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  e BTREE_FORDELET
22160 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  E bit of wrFlag 
22170 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  may optionally b
22180 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57  e set if BTREE_W
22190 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20  RCSR.** is set. 
221a0 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73   If FORDELETE is
221b0 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
221c0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
221d0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
221e0 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  ** this cursor w
221f0 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
22200 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20   to seek to and 
22210 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f  delete entries o
22220 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73  f an index.** as
22230 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
22240 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
22250 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45  nt.  The FORDELE
22260 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  TE hint is not u
22270 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69  sed by.** this i
22280 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
22290 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65  But in a hypothe
222a0 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76  tical alternativ
222b0 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
222c0 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e   .** in which in
222d0 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
222e0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
222f0 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65  leted when corre
22300 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a  sponding table.*
22310 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  * rows are delet
22320 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54  ed, the FORDELET
22330 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74  E flag is a hint
22340 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61   that all SEEK a
22350 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65  nd DELETE.** ope
22360 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20  rations on this 
22370 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f  cursor can be no
22380 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41  -ops and all REA
22390 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e  D operations can
223a0 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75   .** return a nu
223b0 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a  ll row (2-bytes:
223c0 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a   0x01 0x00)..**.
223d0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
223e0 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
223f0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
22400 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
22410 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
22420 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
22430 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
22440 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
22450 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
22460 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
22470 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
22480 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
22490 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
224a0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
224b0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
224c0 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
224d0 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
224e0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
224f0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
22500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
22510 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22520 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
22550 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
22560 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22580 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22590 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
225a0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
225d0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
225e0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
225f0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22610 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
22620 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
22630 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
22640 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22660 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
22670 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
22680 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22690 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
226a0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
226b0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
226c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
226f0 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
22700 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
22710 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22720 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
22730 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
22740 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20   wrFlag==0 .    
22750 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54     || wrFlag==BT
22760 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20  REE_WRCSR .     
22770 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54    || wrFlag==(BT
22780 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f  REE_WRCSR|BTREE_
22790 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b  FORDELETE) .  );
227a0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
227b0 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
227c0 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
227d0 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
227e0 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
227f0 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
22800 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
22810 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
22820 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
22830 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
22840 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
22850 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
22860 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
22870 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
22880 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
22890 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
228a0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
228b0 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
228c0 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77   pKeyInfo!=0, (w
228d0 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20  rFlag?2:1)) );. 
228e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
228f0 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
22900 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
22910 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
22920 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
22930 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
22940 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
22950 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
22960 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
22970 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
22980 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22990 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
229a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
229b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
229c0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
229d0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
229e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
229f0 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
22a00 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
22a10 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
22a20 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
22a30 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
22a40 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
22a50 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
22a60 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22a70 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
22a80 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
22a90 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
22aa0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
22ab0 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
22ac0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
22ad0 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
22ae0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
22af0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
22b00 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
22b10 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
22b20 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
22b30 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
22b40 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
22b50 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
22b60 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
22b70 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
22b80 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
22b90 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
22ba0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
22bb0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
22bc0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
22bd0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
22be0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
22bf0 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57   wrFlag ? BTCF_W
22c00 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20  riteFlag : 0;.  
22c10 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
22c20 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
22c30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
22c40 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
22c50 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
22c60 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
22c70 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
22c80 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
22c90 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
22ca0 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
22cb0 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
22cc0 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
22cd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
22ce0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
22cf0 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
22d00 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
22d10 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
22d20 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22d30 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
22d40 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22d50 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
22d70 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
22d80 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
22d90 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
22da0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
22db0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22dc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22dd0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
22de0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
22df0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e20 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
22e30 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
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 2f 2a 20 52              /* R
22e60 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
22e70 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
22e80 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
22eb0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
22ec0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
22ed0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
22ee0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
22ef0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22f00 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
22f10 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
22f20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
22f50 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
22f60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
22f70 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
22f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
22fa0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
22fb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
22fc0 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
22fd0 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
22fe0 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
22ff0 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
23000 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23030 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
23040 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23050 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
23060 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
23070 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
23080 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
23090 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
230a0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
230b0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
230c0 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
230d0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
230e0 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
230f0 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
23100 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
23110 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
23120 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
23130 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
23140 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23150 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
23160 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
23170 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
23180 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
23190 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
231a0 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
231b0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
231c0 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
231d0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
231e0 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
231f0 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
23200 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
23210 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
23220 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
23230 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
23240 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
23250 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
23260 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
23270 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
23280 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
23290 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
232a0 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
232b0 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
232c0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
232d0 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
232e0 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
232f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
23300 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
23310 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
23320 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
23330 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
23340 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
23350 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
23360 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
23370 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
23380 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
23390 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
233a0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
233b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
233c0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
233d0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
233e0 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
233f0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
23400 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
23410 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
23420 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
23430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23440 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
23450 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23460 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
23470 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
23480 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
23490 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
234a0 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
234b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
234c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
234d0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
234e0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
234f0 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
23500 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
23510 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
23520 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
23530 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
23540 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
23550 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
23560 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23570 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
23580 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
23590 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
235a0 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
235b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
235c0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
235d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
235e0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
235f0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
23600 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
23610 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
23620 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23630 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
23640 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
23650 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
23660 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23670 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
23680 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23690 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
236a0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
236b0 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
236c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
236d0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
236e0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
236f0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
23700 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
23710 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
23720 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
23730 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
23740 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
23750 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
23760 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
23770 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
23780 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
23790 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
237a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
237b0 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
237c0 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
237d0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
237e0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
237f0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
23800 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
23810 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
23820 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
23830 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
23840 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
23850 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
23860 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
23870 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23880 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
23890 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
238a0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
238b0 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
238c0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
238d0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
238e0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
238f0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
23900 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
23910 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
23920 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
23930 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
23940 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23950 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
23960 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
23970 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
23980 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
23990 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
239a0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
239b0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
239c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
239d0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
239e0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
239f0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
23a00 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
23a10 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
23a20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
23a30 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
23a40 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
23a50 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
23a60 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
23a70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
23a80 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
23a90 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
23aa0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
23ab0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
23ac0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23ad0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
23ae0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
23af0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
23b00 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
23b10 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
23b20 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
23b30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
23b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23b50 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23b60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23b70 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
23b80 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
23b90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
23ba0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
23bb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
23bc0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
23bd0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f  he integer key o
23be0 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20  r "rowid" for a 
23bf0 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20  table btree..** 
23c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23c10 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61  only valid for a
23c20 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20   cursor that is 
23c30 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a  pointing into a.
23c40 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  ** ordinary tabl
23c50 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  e btree.  If the
23c60 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
23c70 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65  o an index btree
23c80 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69   or.** is invali
23c90 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  d, the result of
23ca0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23cb0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
23cc0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  64 sqlite3BtreeI
23cd0 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73  ntegerKey(BtCurs
23ce0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
23cf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23d00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23d10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23d20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23d30 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23d40 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
23d50 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
23d60 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
23d70 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  n pCur->info.nKe
23d80 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
23d90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23da0 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
23db0 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  d for the entry 
23dc0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
23dd0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23de0 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c  ng to.  For tabl
23df0 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  e btrees, this w
23e00 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e  ill be the amoun
23e10 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46  t.** of data.  F
23e20 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c  or index btrees,
23e30 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
23e40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65  e size of the ke
23e50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
23e60 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
23e70 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
23e80 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23e90 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
23ea0 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
23eb0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
23ec0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23ed0 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
23ee0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
23ef0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
23f00 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
23f10 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71  VALID..*/.u32 sq
23f20 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
23f30 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  dSize(BtCursor *
23f40 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
23f50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23f60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23f70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23f80 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23f90 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23fa0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
23fb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
23fc0 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  load;.}../*.** G
23fd0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
23fe0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
23ff0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
24000 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
24010 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
24020 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
24030 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
24040 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
24050 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
24060 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
24070 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
24080 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
24090 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
240a0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
240b0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
240c0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
240d0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
240e0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
240f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
24100 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
24110 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24120 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
24130 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
24140 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24150 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
24160 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
24170 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
24180 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
24190 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
241a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
241b0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
241c0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
241d0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
241e0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
241f0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
24200 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
24210 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
24220 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
24230 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
24240 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
24250 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
24260 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
24270 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
24280 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
24290 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
242a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
242b0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
242c0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
242d0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
242e0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
242f0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
24300 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
24310 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
24320 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
24330 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
24340 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
24350 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
24360 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24370 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
24380 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
24390 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
243a0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
243b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
243c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
243d0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243f0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
24400 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
24410 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
24420 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
24430 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
24440 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
24450 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
24460 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
24470 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
24480 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24490 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
244a0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
244b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
244c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
244d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
244e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
244f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
24500 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
24510 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
24520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24530 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24540 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
24550 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24560 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24570 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
24580 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
24590 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
245a0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
245b0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
245c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
245d0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
245e0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
245f0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
24600 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
24610 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
24620 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
24630 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
24640 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
24650 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24660 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
24670 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
24680 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
24690 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
246a0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
246b0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
246c0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
246d0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
246e0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
246f0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
24700 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
24710 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
24720 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
24730 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
24740 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
24750 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24760 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
24770 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
24780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24790 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
247a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
247b0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
247c0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
247d0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
247e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
247f0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
24800 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
24810 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
24820 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
24830 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
24840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24850 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
24860 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
24870 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
24880 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
24890 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
248a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
248b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
248c0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
248d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
248e0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
248f0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
24900 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
24910 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
24920 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
24930 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
24940 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
24950 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
24960 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
24970 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
24980 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
24990 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
249a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
249b0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
249c0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
249d0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
249e0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
249f0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
24a00 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
24a10 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
24a20 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
24a30 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
24a40 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
24a50 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
24a60 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
24a70 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
24a80 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
24a90 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
24aa0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
24ab0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
24ac0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
24ad0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
24ae0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
24af0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
24b00 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
24b10 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
24b20 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
24b30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24b40 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
24b50 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
24b60 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
24b70 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
24b80 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
24b90 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
24ba0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
24bb0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
24bc0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
24bd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
24be0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
24bf0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
24c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24c10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
24c20 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
24c30 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
24c40 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
24c50 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
24c60 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
24c70 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
24c80 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
24c90 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
24ca0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
24cb0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
24cc0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24cd0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
24ce0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
24cf0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
24d00 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
24d10 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
24d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24d50 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
24d60 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
24d70 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
24d80 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
24d90 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
24da0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
24db0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
24dc0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
24dd0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
24de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24e00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24e10 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
24e20 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
24e30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
24e40 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
24e50 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
24e60 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
24e70 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
24e80 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
24e90 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
24ea0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
24eb0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
24ec0 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
24ed0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24ee0 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
24ef0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
24f00 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
24f10 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24f20 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
24f30 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
24f40 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
24f50 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24f60 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
24f70 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
24f80 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
24f90 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
24fa0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
24fb0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
24fc0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
24fd0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
24fe0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
24ff0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
25000 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
25010 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
25020 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
25030 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
25040 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
25050 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
25060 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
25070 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
25080 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
25090 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
250a0 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
250b0 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
250c0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
250d0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
250e0 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
250f0 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
25100 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
25110 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
25120 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
25130 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
25140 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
25150 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
25160 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
25170 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
25180 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
25190 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
251a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
251b0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
251c0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
251d0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
251e0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
251f0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
25200 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
25210 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
25220 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
25230 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
25240 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
25250 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
25260 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
25270 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
25280 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
25290 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
252a0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
252b0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
252c0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
252d0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
252e0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
252f0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
25300 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
25310 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
25320 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
25330 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
25340 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
25350 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
25360 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
25370 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
25380 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
25390 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
253a0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
253b0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
253c0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
253d0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253f0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
25400 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
25410 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
25420 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
25430 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
25440 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25460 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
25470 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
25480 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
25490 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
254a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
254b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
254c0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
254d0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
254e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
254f0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
25500 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
25510 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
25520 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
25530 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
25540 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
25550 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
25560 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
25570 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25580 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
25590 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
255a0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
255b0 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e   pBuf;.  int bEn
255c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
255f0 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
25600 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
25610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
25620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25630 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25640 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25650 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
25670 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
25680 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25690 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
256a0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
256b0 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
256c0 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
256d0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
256e0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
256f0 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
25700 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
25710 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
25720 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
25730 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
25740 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
25750 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
25760 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
25770 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
25780 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
25790 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
257a0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
257b0 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
257c0 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
257d0 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
257e0 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
257f0 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
25800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
25810 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25820 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
25830 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
25840 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
25850 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
25860 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
25870 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
25880 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
25890 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
258a0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
258b0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
258c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
258d0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
258e0 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
258f0 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
25900 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
25910 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
25920 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
25930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25940 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25950 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
25960 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
25970 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
25980 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
25990 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
259a0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
259b0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
259c0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
259d0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
259e0 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
259f0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
25a00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
25a10 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
25a20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
25a30 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
25a40 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
25a50 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
25a60 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
25a70 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
25a80 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
25a90 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
25aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
25ab0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
25ac0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
25ad0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25ae0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
25af0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
25b00 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
25b10 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
25b20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
25b30 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
25b40 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
25b50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
25b60 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
25b70 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
25b80 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
25b90 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
25ba0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
25bb0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
25bc0 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
25bd0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
25be0 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
25bf0 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c  allocate aOverfl
25c00 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e  ow[] for eOp==2.
25c10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
25c20 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
25c30 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
25c40 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
25c50 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
25c60 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
25c70 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
25c80 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25c90 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
25ca0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
25cb0 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
25cc0 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
25cd0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
25ce0 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
25cf0 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
25d00 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
25d10 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
25d20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
25d30 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
25d40 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
25d50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25d60 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
25d80 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
25d90 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
25da0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
25db0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
25dc0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
25dd0 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
25de0 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
25df0 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
25e00 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
25e10 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
25e20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25e30 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
25e40 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
25e50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
25e60 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
25e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25e80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ea0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
25eb0 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
25ec0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
25ed0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
25ee0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
25ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
25f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25f10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
25f20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
25f30 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
25f40 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
25f50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25f60 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
25f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25f80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
25f90 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25fa0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
25fb0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
25fc0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
25fd0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
25fe0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
25ff0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
26000 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
26010 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
26020 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
26030 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26040 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
26050 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
26060 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
26070 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
26080 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
26090 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
260a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
260b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
260c0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
260d0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
260e0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
260f0 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
26100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
26110 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
26120 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
26130 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
26140 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
26150 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26160 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
26170 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
26180 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
26190 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
261a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
261b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
261c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
261d0 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76      || pCur->aOv
261e0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
261f0 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  xtPage.         
26200 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
26210 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20  T_DB );.        
26220 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26230 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
26240 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26250 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
26260 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
26270 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
26280 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
26290 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
262a0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
262b0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
262c0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
262d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
262e0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
262f0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
26300 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
26310 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
26320 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
26330 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
26340 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
26350 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
26360 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
26370 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
26380 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
26390 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
263a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
263b0 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
263c0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
263d0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
263e0 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
263f0 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
26400 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
26410 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
26420 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
26430 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
26440 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
26450 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
26460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26470 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26480 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
26490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
264a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
264b0 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
264c0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
264d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
264e0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
264f0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
26500 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
26510 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
26520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26530 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
26540 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
26550 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
26560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26570 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
26580 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
26590 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
265a0 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
265b0 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
265c0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
265d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
265e0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
265f0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
26600 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
26610 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
26620 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
26630 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
26640 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
26650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
26660 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
26670 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
26680 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
26690 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
266a0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
266b0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
266c0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
266d0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
266e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
266f0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
26700 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
26710 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
26720 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
26730 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
26740 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
26750 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
26760 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
26770 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
26780 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
26790 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
267a0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
267b0 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
267c0 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
267d0 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
267e0 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
267f0 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
26800 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
26810 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
26820 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26830 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
26840 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
26850 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
26860 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
26870 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
26880 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61    **   7) at lea
26890 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
268a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
268b0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
268c0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
268d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
268e0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
268f0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
26900 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
26910 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
26920 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
26930 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
26940 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
26950 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
26960 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
26970 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
26980 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
26990 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
269a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
269b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
269c0 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
269d0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
26a00 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
26a10 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==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 20 20 20 20 20                  
26a40 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
26a50 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
26a60 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
26a90 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
26aa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
26ab0 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
26ae0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
26af0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
26b00 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
26b10 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
26b20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26b30 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
26b40 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
26b70 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
26b80 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bb0 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (7) */.        )
26bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
26bd0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
26be0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
26bf0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
26c00 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
26c10 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
26c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e            /* hen
26c40 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  ce (7) */.      
26c50 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
26c60 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
26c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26c80 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
26c90 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
26ca0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
26cb0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
26cc0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26cd0 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
26ce0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
26cf0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
26d00 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
26d10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
26d20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
26d30 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
26d40 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
26d50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26d60 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
26d70 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
26d80 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
26d90 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30    ((eOp&0x01)==0
26da0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26db0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
26dc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26df0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
26e00 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
26e10 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
26e20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26e30 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
26e40 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
26e50 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
26e60 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
26e70 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
26e80 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44  , (eOp&0x01), pD
26e90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26ea0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26eb0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
26ed0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
26ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26ef0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
26f00 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
26f10 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
26f20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26f30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
26f40 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
26f50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
26f60 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
26f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26f80 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
26f90 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
26fa0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
26fb0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
26fc0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
26fd0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
26fe0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
26ff0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27000 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
27010 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
27020 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
27030 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
27040 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
27050 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
27060 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
27070 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
27080 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
27090 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
270a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
270b0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
270c0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
270d0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
270e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
270f0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
27100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27110 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
27120 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
27130 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
27140 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
27150 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27160 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27180 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27190 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
271a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
271b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
271c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
271d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
271e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
271f0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27200 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27210 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
27220 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27230 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
27240 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
27250 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
27260 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
27270 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
27280 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
27290 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
272a0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
272b0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
272c0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
272d0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
272e0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
272f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
27300 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
27310 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
27320 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
27330 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
27340 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
27350 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
27360 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
27370 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
27380 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
27390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
273a0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
273b0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
273c0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
273d0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
273e0 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
273f0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
27400 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
27410 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27420 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
27430 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
27440 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
27450 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27460 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27470 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27480 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
27490 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
274a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
274b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
274c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
274d0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
274e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
274f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
27500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
27510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27520 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27530 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27540 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27550 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27560 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
27570 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
27580 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
27590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
275a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
275b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
275c0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
275d0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
275e0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
275f0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
27600 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
27610 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
27620 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
27630 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
27640 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
27650 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
27660 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
27670 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
27680 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
27690 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
276a0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
276b0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
276c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
276d0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
276e0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
276f0 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
27700 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
27710 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
27720 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27730 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
27740 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
27750 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
27760 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
27770 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
27780 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
27790 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
277a0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
277b0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
277c0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
277d0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
277e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
277f0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
27800 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
27810 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
27820 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
27830 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
27840 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
27850 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
27860 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
27870 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
27880 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
27890 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
278a0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
278b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
278c0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
278d0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
278e0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
278f0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
27900 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
27910 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
27920 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
27930 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
27940 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
27950 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
27960 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
27970 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
27980 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
27990 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
279a0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
279b0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
279c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
279d0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
279e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
279f0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
27a00 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
27a10 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20  .){.  u32 amt;. 
27a20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
27a30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
27a40 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
27a50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27a70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27a80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
27a90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27aa0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
27ab0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
27ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
27ad0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27ae0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27af0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
27b00 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
27b10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27b20 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
27b30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b40 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
27b50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27b60 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43  info.pPayload>pC
27b70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27b80 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c  >iPage]->aData |
27b90 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
27ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27bb0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43  info.pPayload<pC
27bc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27bd0 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
27be0 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
27bf0 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70  .  amt = (int)(p
27c00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27c10 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
27c20 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
27c30 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28  pPayload);.  if(
27c40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27c50 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70  al<amt ) amt = p
27c60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27c70 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b  ;.  *pAmt = amt;
27c80 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
27c90 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  )pCur->info.pPay
27ca0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
27cb0 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
27cc0 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
27cd0 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
27ce0 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
27cf0 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
27d00 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
27d10 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
27d20 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
27d30 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
27d40 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
27d50 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
27d60 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
27d70 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
27d80 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
27d90 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
27da0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
27db0 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
27dc0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
27dd0 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
27de0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
27df0 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
27e00 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
27e10 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
27e20 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
27e30 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
27e40 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
27e50 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
27e60 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
27e70 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
27e80 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
27e90 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
27ea0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
27eb0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
27ec0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
27ed0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
27ee0 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
27ef0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
27f00 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63  BtreePayloadFetc
27f10 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
27f20 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
27f30 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
27f40 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
27f50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
27f60 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27f70 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
27f80 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
27f90 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
27fa0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
27fb0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27fc0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
27fd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27fe0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
27ff0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
28000 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
28010 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
28020 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
28030 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
28040 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
28050 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
28060 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
28070 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
28080 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
28090 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
280a0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
280b0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
280c0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
280d0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
280e0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
280f0 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
28100 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
28110 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28120 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28130 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28140 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28150 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
28160 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28170 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
28180 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
28190 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
281a0 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
281b0 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
281c0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
281d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
281e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
281f0 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
28200 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
28210 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
28220 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
28230 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
28240 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Ovfl);.  pCur->i
28250 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e  Page++;.  pCur->
28260 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28270 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e] = 0;.  return
28280 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
28290 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
282a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
282b0 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75    pCur, pCur->cu
282e0 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a  rPagerFlags);.}.
282f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
28300 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
28310 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
28320 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
28330 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
28340 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
28350 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
28360 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
28370 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
28380 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
28390 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
283a0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
283b0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
283c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
283d0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
283e0 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
283f0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
28400 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
28410 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
28420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28430 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
28440 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
28450 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
28460 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
28470 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
28480 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
28490 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
284a0 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
284b0 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
284e0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
284f0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
28500 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
28510 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
28520 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
28530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28540 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
28550 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
28560 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
28570 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
28580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
28590 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
285a0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
285b0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
285c0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
285d0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
285e0 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
285f0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
28600 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
28610 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
28620 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
28630 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
28640 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
28650 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
28660 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
28670 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
28680 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
28690 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
286a0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
286b0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
286c0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
286d0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
286e0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
286f0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
28700 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
28710 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
28720 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
28730 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28740 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28760 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28770 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28780 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
28790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
287a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
287b0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
287c0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
287d0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
287e0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
287f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
28800 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
28810 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
28820 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28830 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
28840 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
28850 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
28860 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
28870 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
28880 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
28890 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
288a0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
288b0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
288c0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
288d0 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65  Ovfl);.  release
288e0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
288f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28900 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
28910 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28920 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
28930 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
28940 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
28950 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
28960 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
28970 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
28980 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
28990 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
289a0 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
289b0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
289c0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
289d0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
289e0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
289f0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
28a00 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
28a10 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
28a20 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
28a30 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
28a40 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
28a50 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
28a60 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
28a70 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
28a80 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
28a90 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
28aa0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
28ab0 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
28ac0 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
28ad0 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
28ae0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
28af0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
28b00 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
28b10 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
28b20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
28b30 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
28b40 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
28b50 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
28b60 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
28b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
28b80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
28b90 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
28ba0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
28bb0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
28bc0 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
28bd0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
28be0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
28bf0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
28c00 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
28c10 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
28c20 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
28c30 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
28c40 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
28c50 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
28c60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
28c70 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
28c80 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
28c90 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
28ca0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
28cb0 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
28cc0 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
28cd0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
28ce0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28cf0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
28d00 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
28d10 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
28d20 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
28d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28d40 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
28d50 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
28d60 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
28d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28d80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28d90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28da0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28db0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28dc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
28dd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
28de0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
28df0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
28e00 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
28e10 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
28e20 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
28e30 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
28e40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
28e50 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28e60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
28e70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28e80 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
28e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28ea0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
28eb0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
28ec0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
28ed0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
28ee0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28ef0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
28f00 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28f10 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
28f20 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
28f30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28f40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28f50 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
28f60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
28f70 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
28f80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28f90 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
28fa0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
28fb0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
28fc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28fd0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28ff0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29010 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
29020 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
29030 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
29040 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
29050 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
29060 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
29090 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
290a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
290b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
290c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
290d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
290e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
290f0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
29100 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
29110 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
29120 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
29130 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
29140 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
29150 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
29160 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
29170 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
29180 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
29190 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
291a0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
291b0 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
291c0 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
291d0 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
291e0 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
291f0 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
29200 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
29210 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
29220 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
29230 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
29240 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
29250 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
29260 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
29270 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
29280 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
29290 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
292a0 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
292b0 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
292c0 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
292d0 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
292e0 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
292f0 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
29300 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
29310 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
29320 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
29330 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
29340 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
29350 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
29360 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
29370 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
29380 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
29390 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
293a0 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
293b0 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
293c0 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
293d0 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
293e0 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
293f0 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
29400 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
29410 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
29420 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
29430 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
29440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
29460 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
29470 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29480 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29490 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
294a0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
294b0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
294c0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
294d0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
294e0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
294f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29500 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
29510 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
29520 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
29530 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
29540 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
29550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29560 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29570 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
29580 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
29590 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
295a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
295b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
295c0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
295d0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
295e0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
295f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
29600 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29610 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
29620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29630 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
29640 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
29650 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
29660 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29670 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
29680 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
29690 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
296a0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
296b0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
296c0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
296d0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
296e0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
296f0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29700 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
29710 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
29720 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29730 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
29740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
29750 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
29760 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29770 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29790 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
297a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
297b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
297c0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
297d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
297e0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
297f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29800 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29810 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
29820 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
29830 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
29840 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29850 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29860 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
29870 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29880 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
29890 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
298a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
298b0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
298c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
298d0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
298e0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
298f0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
29900 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
29910 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
29920 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
29930 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
29940 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
29950 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
29960 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
29970 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
29980 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29990 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
299a0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
299b0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
299c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
299d0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
299e0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
299f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
29a00 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
29a10 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
29a20 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
29a30 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
29a40 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29a50 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
29a60 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
29a70 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
29a80 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
29a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
29aa0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29ab0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ac0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29ad0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29ae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29af0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29b00 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
29b10 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29b20 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29b30 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
29b40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29b50 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29b60 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
29b70 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29b80 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29b90 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
29ba0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29bb0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
29bc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29bd0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
29be0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29bf0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29c00 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
29c10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29c20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29c30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29c40 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29c50 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
29c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29c70 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29c80 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
29c90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29ca0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29cb0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29cc0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29cd0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29ce0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29cf0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29d00 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
29d10 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
29d20 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29d30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
29d40 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
29d50 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29d60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
29d70 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29d80 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29d90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29da0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29db0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29dc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
29dd0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
29de0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
29df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29e00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29e10 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
29e20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29e30 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
29e40 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
29e50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29e60 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
29e70 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
29e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
29ea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29eb0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
29ec0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
29ed0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
29ee0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
29ef0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29f00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
29f10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29f20 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
29f30 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
29f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
29f50 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
29f60 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
29f70 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
29f80 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
29f90 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
29fa0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
29fb0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
29fc0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
29fd0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
29fe0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
29ff0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2a000 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2a010 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a020 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a030 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a040 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a050 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a060 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2a070 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2a080 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2a090 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2a0a0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2a0b0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2a0c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2a0d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a0e0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a0f0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2a100 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2a110 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2a120 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2a130 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2a140 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2a150 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2a160 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a170 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2a180 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2a190 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2a1a0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2a1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a1c0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2a1d0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2a1e0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2a1f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a200 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a210 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
2a220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a230 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2a240 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2a250 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a260 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2a270 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a280 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2a290 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a2a0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a2c0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2a2d0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a2e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a2f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a300 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a310 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a320 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a330 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a360 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a370 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2a380 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2a390 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a3a0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2a3b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a3c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a3d0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2a3e0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a400 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a410 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2a420 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2a430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a440 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2a450 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2a460 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2a470 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2a480 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2a490 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2a4a0 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2a4b0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2a4c0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2a4d0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2a4e0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2a4f0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2a500 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2a510 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2a520 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2a530 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2a540 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2a550 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2a560 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2a570 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2a580 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2a590 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2a5a0 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2a5b0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2a5c0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2a5d0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2a5e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2a5f0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2a600 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2a610 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2a620 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2a630 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2a640 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2a650 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2a660 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2a670 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2a680 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2a690 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2a6a0 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2a6b0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2a6c0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2a6d0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2a6e0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2a6f0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2a700 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2a710 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2a720 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2a730 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2a740 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2a750 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2a760 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2a770 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2a780 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2a790 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2a7a0 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2a7b0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2a7c0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2a7d0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2a7e0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a7f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a800 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a820 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2a830 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2a840 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2a850 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2a860 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a870 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a880 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a890 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2a8a0 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2a8b0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2a8c0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2a8d0 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2a8e0 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2a8f0 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2a900 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2a910 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2a920 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2a930 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2a940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a950 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2a960 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2a970 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2a980 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2a990 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2a9a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2a9b0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2a9c0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2a9d0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a9f0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2aa00 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2aa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2aa20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2aa30 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2aa40 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2aa50 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2aa60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2aa70 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2aa80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2aa90 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2aaa0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2aab0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2aac0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2aad0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2aae0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2aaf0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2ab00 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2ab10 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2ab20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2ab30 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ab40 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2ab50 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
2ab60 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2ab70 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 7c  >curIntKey!=0) |
2ab80 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2ab90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2aba0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2abb0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2abc0 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2abd0 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2abe0 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2abf0 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2ac00 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2ac10 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2ac20 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2ac30 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2ac40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ac50 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2ac60 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2ac70 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2ac80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2ac90 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2aca0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2acb0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2acc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2acd0 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2ace0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2acf0 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2ad00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2ad10 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2ad20 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2ad30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ad40 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2ad50 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2ad60 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ad70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2ad80 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2ad90 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2ada0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2adb0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2adc0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2add0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2ade0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2adf0 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2ae00 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2ae10 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2ae20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2ae30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ae40 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2ae50 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2ae60 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2ae70 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2ae80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2ae90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2aea0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2aeb0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2aec0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2aed0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2aee0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2aef0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2af00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2af10 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2af20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2af30 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2af40 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2af50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2af60 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2af70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2af80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2af90 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2afa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2afb0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2afc0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2afd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2afe0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2aff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b000 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b010 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2b020 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2b030 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2b040 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2b050 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2b060 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2b070 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2b080 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2b090 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2b0a0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2b0b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b0c0 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2b0d0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2b100 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2b110 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2b120 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2b130 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2b140 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2b150 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2b160 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2b170 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2b180 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2b190 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2b1a0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2b1b0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2b1c0 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2b1d0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2b1e0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2b1f0 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2b200 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2b210 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2b220 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2b230 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2b240 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2b250 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2b260 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2b270 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2b280 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2b290 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2b2a0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2b2b0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2b2c0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2b2d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b2e0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2b2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b300 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2b310 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2b320 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2b330 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2b340 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2b350 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2b360 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2b370 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2b380 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2b390 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2b3a0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2b3b0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2b3c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b3d0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b3e0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2b3f0 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2b400 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b410 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2b420 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2b430 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2b440 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2b450 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2b460 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2b470 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2b480 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2b490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b4a0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2b4b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2b4c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b4d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b4f0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2b500 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2b510 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b520 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2b530 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b540 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2b550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b560 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2b570 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b580 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2b590 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2b5a0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2b5b0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2b5c0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2b5d0 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2b5e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b5f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b600 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2b610 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2b620 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2b630 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2b640 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b650 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2b660 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2b670 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b680 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b690 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b6a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b6c0 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2b6d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b6e0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2b6f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b700 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2b710 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2b720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b730 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
2b740 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b750 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b770 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2b780 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2b790 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2b7a0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2b7b0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2b7c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b7d0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2b7e0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2b7f0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2b800 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2b810 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2b820 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2b830 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2b840 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2b850 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2b860 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2b870 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2b880 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2b890 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2b8a0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2b8b0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2b8c0 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2b8d0 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2b8e0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2b8f0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2b900 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2b910 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2b920 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2b930 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2b940 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2b950 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2b960 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2b970 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2b980 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2b990 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2b9a0 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2b9b0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2b9c0 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2b9d0 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2b9e0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2b9f0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2ba00 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2ba10 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2ba20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ba30 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2ba40 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2ba50 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2ba60 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2ba70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2ba80 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2ba90 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2baa0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2bab0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2bac0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2bad0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2bae0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2baf0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2bb00 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2bb10 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2bb20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bb30 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2bb40 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2bb50 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2bb60 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2bb70 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2bb80 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2bb90 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2bba0 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2bbb0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2bbc0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2bbd0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2bbe0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2bbf0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2bc00 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2bc10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2bc20 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2bc30 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2bc40 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2bc50 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2bc60 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2bc70 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2bc80 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2bc90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2bca0 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2bcb0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2bcc0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2bcd0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2bce0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2bcf0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2bd00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2bd30 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2bd40 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2bd50 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2bd60 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2bd70 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2bd80 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2bd90 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2bda0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2bdb0 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2bdc0 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2bdd0 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2bde0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2bdf0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2be00 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2be10 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2be20 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2be30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2be40 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2be50 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2be60 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2be70 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2be80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2be90 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2bea0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2beb0 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2bec0 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2bed0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2bee0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2bef0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2bf00 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2bf10 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2bf20 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2bf30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2bf40 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2bf50 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2bf60 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2bf70 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2bf80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2bf90 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2bfa0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2bfb0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2bfc0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2bfd0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2bfe0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2bff0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c000 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2c010 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2c020 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2c030 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2c040 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c050 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2c060 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2c070 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2c080 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c090 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2c0a0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2c0b0 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2c0c0 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2c0d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2c0e0 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2c0f0 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2c100 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2c110 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2c120 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2c130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2c140 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c150 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c160 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c180 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2c190 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2c1a0 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2c1b0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2c1c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c1e0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2c1f0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c200 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c220 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c230 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2c240 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2c250 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2c260 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2c270 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c280 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
2c290 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2c2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2c2b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2c2c0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2c2d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c2e0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c2f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2c300 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2c310 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2c320 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2c330 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c340 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2c350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2c360 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2c370 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2c380 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2c390 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2c3a0 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2c3b0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2c3c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2c3d0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2c3e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2c3f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c400 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2c410 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2c420 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c430 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2c440 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2c450 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c460 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2c470 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2c480 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c490 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c4b0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c4c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c4d0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c4e0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2c4f0 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2c500 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2c510 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c520 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c540 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2c550 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2c560 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2c570 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2c580 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2c590 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2c5a0 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2c5b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2c5c0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2c5d0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2c5e0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2c5f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c600 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2c610 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2c620 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2c630 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c640 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2c650 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c660 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2c670 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2c680 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c690 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c6a0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2c6b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c6c0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2c6d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c6e0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2c6f0 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2c700 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2c710 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2c720 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c730 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c740 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2c750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c760 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2c770 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2c780 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2c790 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c7a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c7b0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2c7c0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2c7d0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2c7e0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2c7f0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2c800 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2c810 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2c820 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2c830 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2c840 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2c850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c860 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2c870 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2c880 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2c890 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2c8a0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2c8b0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2c8c0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2c8d0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2c8e0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2c8f0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2c900 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c910 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2c920 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2c930 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2c940 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2c950 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2c960 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2c970 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2c980 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2c990 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c9a0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2c9b0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2c9c0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2c9d0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2c9e0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2c9f0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2ca00 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2ca10 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2ca20 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2ca30 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2ca40 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2ca50 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2ca60 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2ca70 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2ca80 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2ca90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2caa0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2cab0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2cac0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2cad0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2cae0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2caf0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2cb00 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2cb10 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2cb20 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2cb30 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2cb40 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2cb50 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2cb60 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2cb70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2cb80 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2cb90 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2cba0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2cbb0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2cbc0 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2cbd0 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2cbe0 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2cbf0 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2cc00 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2cc10 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2cc20 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2cc30 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2cc40 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2cc50 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2cc60 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2cc70 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2cc80 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2cc90 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2cca0 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2ccb0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2ccc0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2ccd0 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2cce0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2ccf0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2cd00 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2cd10 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2cd20 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2cd30 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2cd40 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2cd50 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2cd60 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2cd70 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2cd80 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2cd90 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2cda0 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2cdb0 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2cdc0 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2cdd0 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2cde0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2cdf0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2ce00 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2ce10 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2ce20 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2ce30 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2ce40 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2ce50 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2ce60 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2ce70 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2ce80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2ce90 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2cea0 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2ceb0 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2cec0 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2ced0 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2cee0 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2cef0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2cf00 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2cf10 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2cf20 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2cf30 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2cf40 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2cf50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2cf60 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2cf70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2cf80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2cf90 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2cfa0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2cfb0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2cfc0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2cfd0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2cfe0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2cff0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2d000 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2d010 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2d020 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2d030 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2d040 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2d050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d060 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d070 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2d080 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2d090 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2d0a0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2d0b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d0c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2d0d0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d0e0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2d0f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d100 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d110 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2d120 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2d130 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2d140 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d150 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2d160 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2d170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2d180 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d1a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d1b0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2d1c0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2d1d0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2d1e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d1f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d200 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2d210 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d230 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2d240 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2d250 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2d260 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2d270 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2d280 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2d290 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2d2a0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2d2b0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2d2c0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2d2d0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2d2e0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2d2f0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2d300 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2d310 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2d320 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2d330 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2d340 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2d350 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2d360 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2d370 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2d380 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2d390 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2d3a0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2d3b0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2d3c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d3d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d3e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2d3f0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2d400 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2d410 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2d420 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2d430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2d440 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d450 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d460 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d470 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2d480 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2d490 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2d4a0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2d4b0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d4c0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2d4d0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2d4e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2d500 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2d510 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2d520 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d530 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2d540 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2d550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2d560 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2d570 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2d580 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2d590 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2d5a0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d5b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d5c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d5d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2d5e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d5f0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d610 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d620 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d630 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2d640 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2d650 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d660 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2d670 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2d680 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2d690 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2d6a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2d6b0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2d6c0 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2d6d0 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2d6e0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d6f0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d700 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d710 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
2d720 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2d730 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2d740 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2d750 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2d760 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  vfl);.  *pRes = 
2d770 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2d780 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d790 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2d7a0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2d7b0 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  s);.  pPage = pC
2d7c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d7d0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
2d7e0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2d7f0 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61  ur->iPage])>=pPa
2d800 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2d810 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d820 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2d830 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2d840 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2d850 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2d860 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2d870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d880 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d890 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d8a0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
2d8b0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
2d8c0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
2d8d0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2d8e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2d8f0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2d900 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2d910 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2d920 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2d930 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2d940 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
2d950 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2d960 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2d970 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2d980 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2d990 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2d9a0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2d9b0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2d9c0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
2d9d0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2d9e0 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2d9f0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2da00 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
2da10 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2da20 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2da30 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2da40 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
2da50 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2da60 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2da70 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
2da80 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
2da90 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2daa0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2dab0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2dac0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2dad0 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
2dae0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2daf0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2db00 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2db10 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2db20 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2db30 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2db40 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2db50 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2db60 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2db70 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2db80 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2db90 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2dba0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2dbb0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2dbc0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2dbd0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2dbe0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2dbf0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2dc00 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2dc10 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2dc20 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2dc30 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2dc40 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2dc50 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2dc60 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2dc70 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2dc80 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2dc90 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2dca0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2dcb0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2dcc0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2dcd0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2dce0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2dcf0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2dd00 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2dd10 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2dd20 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2dd30 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
2dd40 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2dd50 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2dd60 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
2dd70 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2dd80 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2dd90 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2dda0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2ddb0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2ddc0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2ddd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2dde0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2ddf0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2de00 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2de10 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2de20 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
2de30 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2de40 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2de50 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
2de60 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2de70 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
2de80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2de90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2dea0 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2deb0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2dec0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2ded0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2def0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2df00 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2df10 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2df20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2df30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2df40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2df50 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2df60 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2df70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2df80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2df90 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2dfa0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2dfb0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2dfc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2dfd0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2dfe0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
2dff0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2e000 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e010 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e030 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2e040 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2e050 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2e060 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e070 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2e080 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e090 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
2e0a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e0b0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
2e0c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e0d0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
2e0e0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e0f0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2e100 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
2e110 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e120 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
2e130 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2e140 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2e150 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2e160 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e170 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
2e180 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e190 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e1a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e1b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e1c0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2e1d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e1f0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2e200 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2e210 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e220 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e230 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e240 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2e250 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64  gs & (BTCF_Valid
2e260 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2e270 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2e280 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e290 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2e2a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e2b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e2c0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
2e2d0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e2e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e2f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e300 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2e310 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2e320 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e350 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e360 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e370 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e380 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72   *pRes){.  asser
2e390 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e3a0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e3b0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2e3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2e3d0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2e3e0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2e3f0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2e400 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2e410 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e420 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e430 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e440 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2e450 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2e460 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2e470 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2e480 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2e490 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e4a0 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2e4b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e4c0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2e4d0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2e4e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2e4f0 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2e500 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2e510 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2e520 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2e530 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e540 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2e550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e560 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2e570 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2e580 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2e590 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2e5a0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2e5b0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2e5c0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2e5d0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2e5e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e5f0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2e600 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2e610 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2e620 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2e630 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2e640 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2e650 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2e660 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2e670 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2e680 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2e690 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2e6a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2e6b0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2e6c0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2e6d0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2e6e0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2e6f0 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
2e700 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
2e710 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2e720 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
2e730 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2e740 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2e750 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2e760 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2e770 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2e780 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2e790 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2e7a0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2e7b0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2e7c0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2e7d0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2e7e0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2e7f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2e800 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2e810 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2e820 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2e830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2e840 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2e850 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2e860 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2e870 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2e880 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2e890 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2e8a0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2e8b0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2e8c0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2e8d0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2e8e0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2e8f0 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2e900 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2e910 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2e920 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2e930 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2e940 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2e950 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2e960 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2e970 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2e980 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2e990 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2e9a0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2e9b0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2e9c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2e9d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2e9e0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2e9f0 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2ea00 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ea10 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2ea20 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2ea30 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2ea40 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2ea50 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2ea60 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2ea70 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2ea80 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2ea90 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2eab0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2eac0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2ead0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2eae0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2eaf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2eb00 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2eb10 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2eb20 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2eb30 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2eb40 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2eb50 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2eb60 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2eb70 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2eb80 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2eb90 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2eba0 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2ebb0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2ebc0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2ebd0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2ebe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ebf0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ec00 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ec10 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ec20 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2ec30 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2ec40 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2ec50 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2ec60 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2ec70 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2ec80 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2ec90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2eca0 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2ecb0 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2ecc0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2ecd0 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2ece0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2ecf0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2ed00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ed10 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2ed20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2ed30 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2ed40 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2ed50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2ed60 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2ed70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ed80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2ed90 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2eda0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2edb0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2edc0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2edd0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2ede0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2edf0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2ee00 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2ee10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2ee20 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2ee30 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2ee40 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
2ee50 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
2ee60 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2ee70 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
2ee80 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2ee90 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2eea0 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2eeb0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2eec0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2eed0 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2eee0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2eef0 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2ef00 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2ef10 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2ef20 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2ef30 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2ef40 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2ef50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ef60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ef70 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2ef80 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2ef90 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2efa0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2efb0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2efc0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2efd0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2efe0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2eff0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2f000 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2f010 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2f020 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2f030 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f040 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2f050 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2f060 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2f070 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f080 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2f090 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f0a0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2f0b0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2f0c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2f0d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2f0e0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2f0f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2f100 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2f110 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2f120 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2f130 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2f140 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2f150 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2f160 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2f170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f180 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f190 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f1a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f1b0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2f1c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f1d0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2f1e0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2f1f0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2f200 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2f210 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2f220 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2f230 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2f240 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2f250 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2f260 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2f270 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2f280 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2f290 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f2a0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f2b0 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2f2c0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2f2d0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2f2e0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2f2f0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2f300 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2f310 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2f320 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2f330 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2f340 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
2f350 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f360 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
2f370 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
2f380 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f390 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
2f3a0 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
2f3b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
2f3c0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2f3d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
2f3e0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
2f3f0 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
2f400 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
2f410 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
2f420 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2f430 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2f440 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2f450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f460 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2f470 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
2f480 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
2f490 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f4a0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
2f4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2f4c0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
2f4d0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
2f4e0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
2f4f0 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
2f500 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f510 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
2f520 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
2f530 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f540 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f550 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2f560 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2f570 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2f580 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2f590 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
2f5a0 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
2f5b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f5c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f5d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f5e0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2f5f0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
2f600 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2f610 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2f620 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f630 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f640 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f650 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f670 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2f680 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f690 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2f6a0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
2f6b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
2f6c0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
2f6d0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
2f6e0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f6f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
2f700 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
2f710 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
2f720 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
2f730 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
2f740 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2f750 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
2f760 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2f770 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2f780 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2f790 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2f7a0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2f7b0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2f7c0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2f7d0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2f7e0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2f7f0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2f800 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2f810 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2f820 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2f830 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2f840 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f850 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f860 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2f870 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2f880 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2f890 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f8a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2f8b0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2f8c0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2f8d0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2f8e0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2f8f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2f900 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2f910 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2f920 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2f930 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2f940 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2f950 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2f960 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2f970 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2f980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2f990 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2f9a0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2f9b0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2f9c0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2f9d0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2f9e0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2f9f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fa00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fa10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2fa20 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fa30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fa40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fa50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fa60 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2fa70 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2fa80 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2fa90 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2faa0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fab0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2fac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2fad0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2fae0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2faf0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2fb00 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2fb10 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2fb20 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2fb30 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2fb40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fb50 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fb60 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2fb70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fb80 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2fb90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2fba0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fbb0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2fbc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2fbd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fbe0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2fbf0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2fc00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2fc10 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2fc20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2fc30 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2fc40 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2fc50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2fc60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fc70 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2fc80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fc90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fca0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2fcb0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2fcc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2fcd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2fcf0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fd00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fd10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2fd20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2fd30 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2fd40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fd50 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2fd60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fd80 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2fd90 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2fda0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2fdb0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2fdc0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2fdd0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2fde0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2fdf0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2fe00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2fe10 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2fe20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2fe30 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2fe40 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2fe50 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2fe60 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2fe70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2fe80 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2fe90 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2fea0 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2feb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2fec0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2fed0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fee0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fef0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ff00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ff10 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2ff20 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2ff30 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2ff40 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
2ff50 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
2ff60 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
2ff70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ff80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ff90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ffa0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ffb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ffc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ffd0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
2ffe0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fff0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30010 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30020 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
30030 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30040 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30050 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
30060 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30070 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
30080 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
30090 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
300a0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
300b0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
300c0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
300d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
300e0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
300f0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
30100 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
30110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
30120 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
30130 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
30140 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
30150 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
30160 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30170 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30180 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
30190 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
301a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
301b0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
301c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
301d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
301e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
301f0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
30200 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30220 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
30230 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30240 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30260 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30270 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
30280 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
30290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
302a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
302b0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
302c0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
302d0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
302e0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
302f0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
30300 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
30310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
30320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
30330 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
30340 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
30350 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
30360 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
30370 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
30380 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30390 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
303a0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
303b0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
303c0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
303d0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
303e0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
303f0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
30400 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
30410 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30420 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
30430 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
30440 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
30450 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
30460 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
30470 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
30490 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
304a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
304b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
304c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
304d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
304e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
304f0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
30500 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
30510 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30520 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
30530 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
30540 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
30550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30560 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
30570 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
30580 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30590 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
305a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
305b0 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
305d0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
305e0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
305f0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
30600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30630 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30640 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
30650 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
30660 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
30670 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
30680 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
30690 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
306a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
306b0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
306c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
306d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
306e0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
306f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30700 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30710 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30720 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
30730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
30740 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
30750 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d       || (iPage==
30760 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65  nearby || (iPage
30770 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
30780 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
30790 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
307a0 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
307b0 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
307c0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
307d0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
307e0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
307f0 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
30800 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
30810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
30820 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
30830 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
30840 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
30850 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
30860 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
30870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
30880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30890 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
308a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
308b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
308c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
308d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
308e0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
308f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30900 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
30910 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
30920 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
30930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
30940 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
30950 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
30960 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
30970 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
30980 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f  nt(pBt, *pPgno)?
30990 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
309a0 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20  TENT : 0;.      
309b0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
309c0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
309d0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
309e0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
309f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30a20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
30a30 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
30a40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30a50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30a70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
30a80 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
30a90 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
30aa0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30ac0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30ad0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30ae0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30af0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
30b00 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
30b10 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
30b20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
30b30 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
30b40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
30b50 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
30b60 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
30b70 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
30b80 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
30b90 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
30ba0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
30bb0 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
30bc0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
30bd0 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
30be0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
30bf0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
30c00 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
30c10 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
30c20 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
30c30 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
30c40 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
30c50 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
30c60 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
30c70 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
30c80 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
30c90 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
30ca0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
30cb0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
30cc0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
30cd0 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
30ce0 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
30cf0 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
30d00 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
30d10 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
30d20 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
30d30 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
30d40 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
30d50 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
30d60 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
30d70 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
30d80 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
30d90 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
30da0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
30db0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
30dc0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
30dd0 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
30de0 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
30df0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
30e00 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
30e10 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
30e20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
30e30 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
30e40 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
30e50 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
30e60 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
30e70 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
30e80 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
30e90 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
30ea0 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
30eb0 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
30ec0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
30ed0 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
30ee0 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
30ef0 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
30f00 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
30f10 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
30f20 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
30f30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30f40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
30f50 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
30f60 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
30f70 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
30f80 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
30f90 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
30fa0 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
30fb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30fc0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
30fd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
30fe0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30ff0 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
31000 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
31010 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
31020 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
31030 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
31040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31050 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31060 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31070 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
31080 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
31090 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
310a0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
310b0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
310c0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
310d0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
310e0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
310f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
31100 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
31110 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
31120 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
31130 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
31140 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
31150 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
31160 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
31170 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
31180 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
31190 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
311a0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
311b0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
311c0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
311d0 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
311e0 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
311f0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
31200 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
31210 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31220 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31230 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31240 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
31250 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
31260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31290 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
312a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
312b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
312c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
312d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
312e0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
312f0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
31300 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
31310 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31320 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
31330 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
31340 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
31350 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
31360 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
31370 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
31380 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
31390 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
313a0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
313b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
313c0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
313d0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
313e0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
313f0 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
31400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
31420 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31430 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31440 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31460 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
31470 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
31480 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
31490 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
314a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
314b0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
314c0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
314d0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
314e0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
314f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31500 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
31510 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
31520 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
31530 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31540 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
31550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31560 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
31570 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
31580 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
31590 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
315a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
315b0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
315c0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
315d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
315e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
315f0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
31600 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
31610 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
31620 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
31630 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
31640 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
31650 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
31660 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
31670 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
31680 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31690 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
316a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
316b0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
316c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
316d0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
316e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
316f0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
31700 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
31710 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
31720 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
31730 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
31740 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
31750 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
31760 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
31770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31780 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
31790 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
317a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
317b0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
317c0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
317d0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
317e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
317f0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
31800 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31810 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
31820 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
31830 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
31840 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
31850 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
31860 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31870 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
31880 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31890 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
318a0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
318b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
318c0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
318d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
318e0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
318f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
31900 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
31910 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31930 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
31940 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
31950 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31970 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31980 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
31990 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
319c0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
319d0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
319e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
319f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31a00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31a10 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
31a20 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
31a30 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
31a40 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
31a50 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
31a60 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
31a70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31a80 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
31a90 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
31aa0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
31ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31ac0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
31ad0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
31ae0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
31af0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
31b00 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
31b10 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
31b20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
31b30 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
31b40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31b50 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31b60 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
31b70 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
31b80 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
31b90 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
31ba0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
31bb0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31bc0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
31bd0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
31be0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
31bf0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
31c00 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
31c10 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
31c20 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
31c30 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
31c40 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
31c50 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
31c60 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
31c70 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
31c80 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
31c90 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
31ca0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
31cb0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
31cc0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
31cd0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
31ce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31cf0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
31d00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
31d10 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
31d30 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
31d40 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
31d50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
31d60 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
31d70 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
31d80 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
31d90 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
31da0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
31db0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
31dc0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
31dd0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
31de0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
31df0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
31e00 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
31e10 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
31e20 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
31e30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31e40 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
31e50 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
31e60 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
31e70 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
31e80 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
31e90 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
31ea0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
31eb0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
31ec0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
31ed0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
31ee0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
31ef0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
31f00 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
31f10 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
31f20 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
31f30 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
31f40 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
31f50 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
31f60 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
31f70 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
31f80 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
31f90 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
31fa0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
31fb0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
31fc0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
31fd0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
31fe0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
31ff0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
32000 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
32010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32020 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
32030 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
32040 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
32050 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
32060 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
32070 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
32080 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
32090 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
320a0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
320b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
320c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
320d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
320e0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
320f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
32100 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
32110 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
32120 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
32130 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
32140 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
32150 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
32160 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32170 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32180 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32190 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
321a0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
321b0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
321c0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
321d0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
321e0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
321f0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
32200 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
32210 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
32220 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
32230 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
32240 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
32250 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
32260 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
32270 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
32280 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
32290 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
322a0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
322b0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
322c0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
322d0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
322e0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
322f0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
32300 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
32310 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
32320 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
32330 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
32340 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32350 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
32360 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
32370 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
32380 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
32390 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
323a0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
323b0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
323c0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
323d0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
323e0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
323f0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
32400 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
32410 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
32420 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
32430 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
32440 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
32450 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
32460 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
32470 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
32480 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
32490 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
324a0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
324b0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
324c0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
324d0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
324e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
324f0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
32500 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
32510 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
32520 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32530 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
32540 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
32550 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
32560 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
32570 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
32580 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
32590 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
325a0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
325b0 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
325c0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
325d0 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
325e0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
325f0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
32600 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
32610 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
32620 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
32630 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
32640 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32660 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32670 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32690 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
326a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
326b0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
326c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
326d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
326e0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
326f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
32700 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
32710 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32720 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
32730 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32740 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
32750 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32770 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
32780 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32790 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
327a0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
327b0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
327c0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
327d0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
327e0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
327f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32800 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32810 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
32820 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
32830 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
32840 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
32850 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
32860 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
32870 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
32880 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
32890 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
328a0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
328b0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
328c0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
328d0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
328e0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
328f0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
32900 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32910 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
32920 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
32930 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
32940 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
32950 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
32960 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
32970 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
32980 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
32990 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
329a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
329b0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
329c0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
329d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
329e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
329f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32a00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
32a30 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32a40 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
32a50 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
32a60 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
32a70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
32a80 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
32a90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32aa0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
32ab0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32ac0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
32ad0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
32ae0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32af0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
32b00 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
32b10 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
32b20 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
32b30 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32b40 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
32b50 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
32b60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32b70 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
32b80 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
32b90 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
32ba0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
32bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
32bc0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
32bd0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
32be0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
32bf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
32c00 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
32c10 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
32c20 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
32c30 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
32c40 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
32c50 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
32c60 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
32c70 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
32c80 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
32c90 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
32ca0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32cb0 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
32cc0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
32cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32ce0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
32cf0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32d00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
32d10 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
32d20 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
32d30 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
32d40 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
32d50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
32d60 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
32d70 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
32d80 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
32d90 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
32da0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
32db0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
32dc0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
32dd0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
32de0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
32df0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32e00 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
32e10 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
32e20 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
32e30 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
32e40 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
32e50 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
32e60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66  info.nLocal==inf
32e70 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
32e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32e90 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
32ea0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
32eb0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
32ec0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
32ed0 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
32ee0 2e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65  .nSize-1 > pPage
32ef0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
32f00 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
32f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
32f20 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
32f30 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
32f40 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
32f50 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
32f60 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
32f70 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34  + info.nSize - 4
32f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
32f90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
32fa0 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
32fb0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
32fc0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
32fd0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
32fe0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
32ff0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
33000 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
33010 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
33020 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
33030 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66  RRUPT_DB && (inf
33040 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66  o.nPayload + ovf
33050 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50  lPageSize)<ovflP
33060 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20  ageSize).  );.  
33070 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
33080 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
33090 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
330a0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
330b0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
330c0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
330d0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
330e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
330f0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
33100 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
33110 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
33120 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
33130 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
33140 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
33150 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
33160 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
33170 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
33180 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
33190 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
331a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
331b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
331c0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
331d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
331e0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
331f0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
33200 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
33210 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33220 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
33230 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
33240 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
33250 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
33260 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
33270 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
33280 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
33290 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
332a0 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
332b0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
332c0 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
332d0 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
332e0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
332f0 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
33300 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
33310 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
33320 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
33330 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
33340 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
33350 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
33360 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
33370 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
33380 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
33390 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
333a0 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
333b0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
333c0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
333d0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
333e0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
333f0 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
33400 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
33410 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
33420 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
33430 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
33440 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
33450 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
33460 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
33470 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
33480 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
33490 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
334a0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
334b0 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
334c0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
334d0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
334e0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
334f0 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
33500 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
33510 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
33520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33530 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33540 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
33550 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
33560 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
33570 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
33580 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
33590 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
335a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
335b0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
335c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
335d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
335e0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
335f0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
33600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33610 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
33620 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
33630 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
33640 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
33650 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
33660 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
33670 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
33680 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
33690 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
336a0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
336b0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
336c0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
336d0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
336e0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
336f0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
33700 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
33710 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
33720 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
33730 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
33740 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
33750 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
33760 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
33770 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
33780 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
33790 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
337a0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
337b0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
337c0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
337d0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
337e0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
337f0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
33800 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
33810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
33820 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
33830 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
33840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33850 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
33860 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
33870 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33880 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
33890 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
338a0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
338b0 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61  .  const BtreePa
338c0 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20  yload *pX,      
338d0 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74    /* Payload wit
338e0 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  h which to const
338f0 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ruct the cell */
33900 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33920 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
33930 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
33940 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
33950 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
33960 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
33970 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
33980 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
33990 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
339a0 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
339b0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
339c0 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
339d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
339e0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
339f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
33a00 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
33a10 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
33a20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
33a30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33a40 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
33a50 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
33a60 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
33a70 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
33a80 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
33a90 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
33aa0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
33ab0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
33ac0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
33ad0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
33ae0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
33af0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
33b00 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
33b10 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
33b20 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
33b30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
33b40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33b50 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
33b60 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
33b70 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
33b80 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
33b90 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
33ba0 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67  Size;.  if( pPag
33bb0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
33bc0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e   nPayload = pX->
33bd0 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72  nData + pX->nZer
33be0 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  o;.    pSrc = pX
33bf0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  ->pData;.    nSr
33c00 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20  c = pX->nData;. 
33c10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33c20 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20  ->intKeyLeaf ); 
33c30 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  /* fillInCell() 
33c40 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
33c50 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48  leaves */.    nH
33c60 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
33c70 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
33c80 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
33c90 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
33ca0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
33cb0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
33cc0 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20  *)&pX->nKey);.  
33cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33ce0 74 28 20 70 58 2d 3e 6e 44 61 74 61 3d 3d 30 20  t( pX->nData==0 
33cf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33d00 58 2d 3e 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  X->nZero==0 );. 
33d10 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
33d20 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
33d30 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29  && pX->pKey!=0 )
33d40 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61  ;.    nSrc = nPa
33d50 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d  yload = (int)pX-
33d60 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  >nKey;.    pSrc 
33d70 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20  = pX->pKey;.    
33d80 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33d90 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
33da0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
33db0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
33dc0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
33dd0 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79  ad */.  if( nPay
33de0 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
33df0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
33e00 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
33e10 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
33e20 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
33e30 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
33e40 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
33e50 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
33e60 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
33e70 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
33e80 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
33e90 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
33ea0 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
33eb0 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
33ec0 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
33ed0 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
33ee0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
33ef0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
33f00 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33f10 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
33f20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33f30 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
33f40 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
33f50 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33f60 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
33f70 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
33f80 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
33f90 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
33fa0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
33fb0 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
33fc0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
33fd0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
33fe0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
33ff0 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
34000 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
34010 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
34020 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
34030 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
34040 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
34050 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
34060 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
34070 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
34080 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
34090 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
340a0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
340b0 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
340c0 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
340d0 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
340e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
340f0 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
34100 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
34110 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
34120 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
34130 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
34140 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
34150 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
34160 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
34170 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
34180 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
34190 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
341a0 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
341b0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
341c0 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
341d0 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
341e0 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
341f0 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
34200 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
34210 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
34220 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  ectly..  */.#if 
34230 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
34240 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
34250 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
34260 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
34270 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
34280 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
34290 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
342a0 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
342b0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
342c0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
342d0 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
342e0 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
342f0 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
34300 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
34310 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
34320 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
34330 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
34340 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
34350 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
34360 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
34370 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
34380 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
34390 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
343a0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
343b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
343c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
343d0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
343e0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
343f0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
34400 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34410 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
34420 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34430 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
34440 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
34450 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
34460 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
34470 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
34480 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
34490 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
344a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
344b0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
344c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
344d0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
344e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
344f0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
34500 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
34510 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
34520 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
34530 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
34540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
34550 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34560 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
34570 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
34580 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
34590 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
345a0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
345b0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
345c0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
345d0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
345e0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
345f0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
34600 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
34610 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
34620 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
34630 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
34640 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
34650 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
34660 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
34670 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
34680 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
34690 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
346a0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
346b0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
346c0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
346d0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
346e0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
346f0 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
34700 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
34710 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
34720 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
34730 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
34740 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
34750 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
34760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34770 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
34780 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
34790 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
347a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
347b0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
347c0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
347d0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
347e0 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
347f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34800 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34810 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
34820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
34830 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
34840 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
34850 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
34860 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
34870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
34880 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
34890 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
348a0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
348b0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
348c0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
348d0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
348e0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
348f0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
34900 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
34910 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
34920 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
34930 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34940 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
34950 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34960 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
34970 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
34980 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
34990 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
349a0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
349b0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
349c0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
349d0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
349e0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
349f0 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
34a00 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34a10 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34a30 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34a40 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34a50 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34a60 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
34a70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34a80 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
34a90 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
34aa0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
34ab0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
34ac0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
34ad0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
34ae0 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
34af0 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
34b00 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
34b10 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
34b20 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
34b30 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
34b40 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
34b50 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
34b60 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
34b70 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
34b80 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
34b90 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
34ba0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
34bb0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
34bc0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
34bd0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
34be0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
34bf0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34c00 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34c20 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34c30 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
34c40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
34c50 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
34c60 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
34c70 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
34c80 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
34c90 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
34ca0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
34cb0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
34cc0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
34cd0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
34ce0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34cf0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34d00 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34d10 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34d20 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34d30 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
34d40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
34d50 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
34d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
34d70 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
34d80 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
34d90 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
34da0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
34db0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
34dc0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
34dd0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
34de0 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
34df0 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
34e00 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
34e10 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
34e20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
34e30 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
34e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
34e60 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
34e70 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
34e80 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
34e90 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
34ea0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
34eb0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
34ec0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
34ed0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
34ee0 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
34ef0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
34f00 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
34f10 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
34f20 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
34f30 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
34f40 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
34f50 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
34f60 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
34f70 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
34f80 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
34f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
34fa0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
34fb0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
34fc0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
34fd0 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
34fe0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
34ff0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
35000 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
35010 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
35020 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
35030 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
35040 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
35050 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
35060 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
35070 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
35080 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
35090 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
350a0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
350b0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
350c0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
350d0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
350e0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
350f0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35100 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35110 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
35120 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
35130 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
35140 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
35150 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
35160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35170 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
35180 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
35190 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
351a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
351b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
351c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
351d0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
351e0 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
351f0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
35200 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
35210 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
35220 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
35230 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
35240 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
35250 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
35260 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
35270 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
35280 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
35290 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
352a0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
352b0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
352c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
352d0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
352e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
352f0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
35300 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
35310 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
35320 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
35330 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
35340 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35350 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
35360 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
35370 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
35380 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
35390 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
353a0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
353b0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
353c0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
353d0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
353e0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
353f0 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
35400 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35410 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
35420 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
35430 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
35440 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
35450 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
35460 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
35470 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
35480 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
35490 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
354a0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
354b0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
354c0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
354d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
354e0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
354f0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
35500 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
35510 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
35520 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
35530 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
35540 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35550 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
35560 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
35570 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
35580 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
35590 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
355a0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
355b0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
355c0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
355d0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
355e0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
355f0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
35600 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
35610 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
35620 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
35630 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
35640 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
35650 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
35660 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
35670 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
35680 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
35690 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
356a0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
356b0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
356c0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
356d0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
356e0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  mented..**.** *p
356f0 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54  RC must be SQLIT
35700 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72  E_OK when this r
35710 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
35730 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
35740 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
35750 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
35760 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
35770 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
35780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
35790 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
357a0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
357b0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
357c0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
357d0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
357e0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
357f0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
35800 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
35810 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
35820 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
35830 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
35840 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
35850 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
35860 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
35870 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
35880 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
35890 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
358a0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
358b0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
358c0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
358d0 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
358e0 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
358f0 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
35900 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
35910 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
35920 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
35930 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
35940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
35950 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
35960 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
35970 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
35980 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
35990 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b  e */.  u8 *pIns;
359a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
359b0 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e  point in pPage->
359c0 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65  aCellIdx[] where
359d0 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65   no cell inserte
359e0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
359f0 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRC==SQLITE_OK 
35a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  );.  assert( i>=
35a10 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
35a20 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
35a30 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
35a40 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
35a50 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
35a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35a70 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
35a80 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
35a90 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
35aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35ab0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
35ac0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
35ad0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35ae0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35af0 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
35b00 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
35b10 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35b30 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35b40 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
35b50 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
35b60 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
35b70 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
35b80 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
35b90 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
35ba0 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
35bb0 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
35bc0 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
35bd0 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
35be0 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
35bf0 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
35c00 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
35c10 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
35c20 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
35c30 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
35c40 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
35c50 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
35c60 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
35c70 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
35c80 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
35c90 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
35ca0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
35cb0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70  .  assert( sz==p
35cc0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
35cd0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
35ce0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
35cf0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
35d00 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
35d10 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
35d20 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
35d30 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
35d40 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
35d50 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
35d60 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
35d70 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
35d80 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
35d90 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
35da0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
35db0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
35dc0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
35dd0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
35de0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
35df0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
35e00 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
35e10 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
35e20 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
35e30 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
35e40 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f  = (u16)i;..    /
35e50 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
35e60 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c  overflows occur,
35e70 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   they are always
35e80 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20   sequential and 
35e90 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  in.    ** sorted
35ea0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e   order.  This in
35eb0 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62  variants arise b
35ec0 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20  ecause multiple 
35ed0 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20  overflows can.  
35ee0 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20    ** only occur 
35ef0 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
35f00 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
35f10 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
35f20 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  e during.    ** 
35f30 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74  balancing, and t
35f40 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20  he dividers are 
35f50 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72  adjacent and sor
35f60 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
35f70 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
35f80 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35f90 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20  1]<(u16)i ); /* 
35fa0 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72  Overflows in sor
35fb0 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
35fc0 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
35fd0 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66   i==pPage->aiOvf
35fe0 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a  l[j-1]+1 );   /*
35ff0 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73   Overflows are s
36000 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d  equential */.  }
36010 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
36020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36030 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36040 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36060 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
36070 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
36080 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
36090 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
360a0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
360b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
360c0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
360d0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
360e0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
360f0 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d  lOffset]==pPage-
36100 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20  >aCellIdx );.   
36110 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
36120 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
36130 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
36140 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
36150 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
36160 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
36170 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
36180 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
36190 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a  wing properties.
361a0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
361b0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
361c0 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
361d0 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20   idx >= 0 );.   
361e0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
361f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
36200 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
36210 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  +2 || CORRUPT_DB
36220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36230 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
36240 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36250 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
36260 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
36270 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
36280 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
36290 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
362a0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
362b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
362c0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
362d0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
362e0 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65  Ins = pPage->aCe
362f0 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20  llIdx + i*2;.   
36300 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c   memmove(pIns+2,
36310 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d   pIns, 2*(pPage-
36320 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20  >nCell - i));.  
36330 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c    put2byte(pIns,
36340 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65   idx);.    pPage
36350 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f  ->nCell++;.    /
36360 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
36370 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  cell count */.  
36380 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50    if( (++data[pP
36390 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34  age->hdrOffset+4
363a0 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61  ])==0 ) data[pPa
363b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
363c0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
363d0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
363e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
363f0 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  3])==pPage->nCel
36400 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l );.#ifndef SQL
36410 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36420 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
36430 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
36440 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
36450 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
36460 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
36470 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
36480 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
36490 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
364a0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
364b0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
364c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
364d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
364e0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
364f0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
36500 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
36510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43    }.}../*.** A C
36520 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20  ellArray object 
36530 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65  contains a cache
36540 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64   of pointers and
36550 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20   sizes for a.** 
36560 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75  consecutive sequ
36570 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68  ence of cells th
36580 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64  at might be held
36590 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
365a0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
365b0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
365c0 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
365d0 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
365e0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
365f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36600 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
36610 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
36620 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
36630 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
36640 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
36650 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36660 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
36670 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
36680 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
36690 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
366a0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
366b0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
366c0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
366d0 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
366e0 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
366f0 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
36700 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
36710 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
36720 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
36730 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
36740 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
36750 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36760 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36770 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
36780 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
36790 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
367a0 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
367b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
367c0 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
367d0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
367e0 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
367f0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
36800 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
36810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36820 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
36830 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
36840 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
36850 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
36860 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
36870 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
36880 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ]) );.    }.    
36890 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a  idx++;.    N--;.
368a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
368b0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
368c0 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20  the Nth element 
368d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61  of the cell arra
368e0 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  y.*/.static SQLI
368f0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20  TE_NOINLINE u16 
36900 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
36910 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
36920 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36930 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
36940 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36950 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20  p->szCell[N]==0 
36960 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  );.  p->szCell[N
36970 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
36980 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36990 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20  p->apCell[N]);. 
369a0 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
369b0 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  l[N];.}.static u
369c0 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  16 cachedCellSiz
369d0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
369e0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
369f0 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
36a00 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d  Cell );.  if( p-
36a10 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74  >szCell[N] ) ret
36a20 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36a30 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75  ;.  return compu
36a40 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29  teCellSize(p, N)
36a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36a60 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36a70 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
36a80 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
36a90 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
36aa0 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
36ab0 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
36ac0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
36ad0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
36ae0 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
36af0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
36b00 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
36b10 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
36b20 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
36b30 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
36b40 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
36b50 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
36b60 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
36b70 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
36b80 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
36b90 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
36ba0 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
36bb0 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
36bc0 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
36bd0 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
36be0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
36bf0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
36c00 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
36c10 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
36c20 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
36c30 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
36c40 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
36c50 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
36c60 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
36c70 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
36c80 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69  static int rebui
36c90 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  ldPage(.  MemPag
36ca0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
36cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
36cc0 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
36cd0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cf0 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
36d00 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
36d10 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36d20 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36d30 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
36d40 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
36d50 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d70 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
36d80 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  izes */.){.  con
36d90 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
36da0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
36db0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
36dc0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67  of header on pPg
36dd0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
36de0 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
36df0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
36e00 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
36e10 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63  a for pPg */.  c
36e20 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53  onst int usableS
36e30 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
36e40 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38  usableSize;.  u8
36e50 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
36e60 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a  &aData[usableSiz
36e70 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  e];.  int i;.  u
36e80 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50  8 *pCellptr = pP
36e90 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75  g->aCellIdx;.  u
36ea0 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
36eb0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
36ec0 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
36ed0 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  );.  u8 *pData;.
36ee0 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28  .  i = get2byte(
36ef0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  &aData[hdr+5]);.
36f00 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69    memcpy(&pTmp[i
36f10 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73  ], &aData[i], us
36f20 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a  ableSize - i);..
36f30 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a    pData = pEnd;.
36f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
36f50 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
36f60 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
36f70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
36f80 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
36f90 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a  ,aData,pEnd) ){.
36fa0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
36fb0 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
36fc0 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
36fd0 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
36fe0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
36ff0 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
37000 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37010 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37020 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43    if( pData < pC
37030 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20  ellptr ) return 
37040 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37050 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
37060 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a  pData, pCell, sz
37070 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73  Cell[i]);.    as
37080 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d  sert( szCell[i]=
37090 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
370a0 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43  pPg, pCell) || C
370b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
370c0 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c   testcase( szCel
370d0 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]!=pPg->xCell
370e0 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20  Size(pPg,pCell) 
370f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
37100 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
37110 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
37120 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
37130 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
37140 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
37150 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
37160 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37170 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
37180 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
37190 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
371a0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
371b0 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
371c0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
371d0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
371e0 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
371f0 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e  = 0x00;.  return
37200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37210 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37220 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37230 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37240 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37250 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e  ay szCell.** con
37260 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37270 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
37280 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
37290 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
372a0 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65  s to .** add the
372b0 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e   cells stored in
372c0 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61   the array to pa
372d0 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61  ge pPg. If it ca
372e0 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a  nnot (because .*
372f0 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  * the page needs
37300 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e   to be defragmen
37310 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ted before the c
37320 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20  ells will fit), 
37330 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  non-zero.** is r
37340 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
37350 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73  se, if the cells
37360 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65   are added succe
37370 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ssfully, zero is
37380 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
37390 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65  .** Argument pCe
373a0 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20  llptr points to 
373b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
373c0 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
373d0 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61  ter array.** (pa
373e0 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20  rt of page pPg) 
373f0 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74  to populate. Aft
37400 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30  er cell apCell[0
37410 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ] is written to 
37420 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79  the.** page body
37430 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65  , a 16-bit offse
37440 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
37450 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f  pCellptr. And so
37460 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a   on, for each.**
37470 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
37480 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ay. It is the re
37490 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
374a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
374b0 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20  sure.** that it 
374c0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77  is safe to overw
374d0 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f  rite this part o
374e0 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  f the cell-point
374f0 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  er array..**.** 
37500 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
37510 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
37520 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  pData points to 
37530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37540 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65   .** content are
37550 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49  a on page pPg. I
37560 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
37570 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  e content area i
37580 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a  s extended,.** *
37590 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65  ppData is update
375a0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
375b0 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74  e new start of t
375c0 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  he content area.
375d0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
375e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ing..**.** Final
375f0 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65  ly, argument pBe
37600 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  gin points to th
37610 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
37620 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
37630 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73  .** end of the s
37640 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79  pace required by
37650 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74   this page for t
37660 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37670 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c  area (for.** all
37680 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73   cells - not jus
37690 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64  t those inserted
376a0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
376b0 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f  call). If the co
376c0 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75  ntent.** area mu
376d0 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  st be extended t
376e0 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f  o before this po
376f0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
37700 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a  accomodate all.*
37710 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  * cells in apCel
37720 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65  l[], then the ce
37730 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61  lls do not fit a
37740 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  nd non-zero is r
37750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
37760 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72  ic int pageInser
37770 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  tArray(.  MemPag
37780 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
377a0 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74  e to add cells t
377b0 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69  o */.  u8 *pBegi
377c0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
377d0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
377e0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
377f0 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ray */.  u8 **pp
37800 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
37810 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
37820 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74  UT: Page content
37830 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a   -area pointer *
37840 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
37850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37860 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
37870 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  o cell-pointer a
37880 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rea */.  int iFi
37890 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
378a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
378b0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
378c0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
378d0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
378e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
378f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
37900 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a  o add to pPg */.
37910 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
37920 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37930 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37940 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
37950 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
37960 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37970 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
37980 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  ta;.  int iEnd =
37990 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b   iFirst + nCell;
379a0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
379b0 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64  PT_DB || pPg->hd
379c0 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  rOffset==0 );   
379d0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
379e0 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   on page 1 */.  
379f0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
37a00 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
37a10 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20  int sz, rc;.    
37a20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73  u8 *pSlot;.    s
37a30 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69  z = cachedCellSi
37a40 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a  ze(pCArray, i);.
37a50 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31      if( (aData[1
37a60 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d  ]==0 && aData[2]
37a70 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  ==0) || (pSlot =
37a80 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
37a90 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b  g,sz,&rc))==0 ){
37aa0 0a 20 20 20 20 20 20 69 66 28 20 28 70 44 61 74  .      if( (pDat
37ab0 61 20 2d 20 70 42 65 67 69 6e 29 3c 73 7a 20 29  a - pBegin)<sz )
37ac0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
37ad0 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20   pData -= sz;.  
37ae0 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
37af0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  a;.    }.    /* 
37b00 70 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61  pSlot and pCArra
37b10 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c  y->apCell[i] wil
37b20 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20  l never overlap 
37b30 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  on a well-formed
37b40 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
37b50 2e 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68  .  But they migh
37b60 74 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20  t for a corrupt 
37b70 64 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65  database.  Hence
37b80 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20   use memmove(). 
37b90 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63     ** since memc
37ba0 70 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42  py() sends SIGAB
37bb0 4f 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70  ORT with overlap
37bc0 70 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20  ping buffers on 
37bd0 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61  OpenBSD */.    a
37be0 73 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a  ssert( (pSlot+sz
37bf0 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65  )<=pCArray->apCe
37c00 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c  ll[i].         |
37c10 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61  | pSlot>=(pCArra
37c20 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29  y->apCell[i]+sz)
37c30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  .         || COR
37c40 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d  RUPT_DB );.    m
37c50 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43  emmove(pSlot, pC
37c60 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37c70 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
37c80 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
37c90 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
37ca0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
37cb0 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
37cc0 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
37cd0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
37ce0 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
37cf0 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
37d00 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
37d10 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
37d20 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
37d30 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37d40 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37d50 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37d60 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
37d70 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
37d80 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
37d90 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
37da0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
37db0 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
37dc0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
37dd0 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
37de0 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
37df0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
37e00 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
37e10 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
37e20 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
37e30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
37e40 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
37e50 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
37e60 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
37e70 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
37e80 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
37e90 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
37ea0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
37eb0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
37ec0 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
37ed0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
37ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37ef0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c  irst cell to del
37f00 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ete */.  int nCe
37f10 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37f20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
37f30 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
37f40 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
37f50 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
37f60 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37f70 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  ls */.){.  u8 * 
37f80 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
37f90 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
37fa0 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
37fb0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
37fc0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
37fd0 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
37fe0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
37ff0 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
38000 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
38010 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
38020 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
38030 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
38040 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46   nCell;.  u8 *pF
38050 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
38060 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
38070 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
38080 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  nd; i++){.    u8
38090 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61   *pCell = pCArra
380a0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20  y->apCell[i];.  
380b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
380c0 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72  HIN(pCell, pStar
380d0 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  t, pEnd) ){.    
380e0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
380f0 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73  /* No need to us
38100 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  e cachedCellSize
38110 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69  () here.  The si
38120 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
38130 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
38140 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  re to be freed h
38150 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
38160 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65   computing while
38170 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a   deciding which.
38180 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e        ** cells n
38190 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  eed freeing */. 
381a0 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61       sz = pCArra
381b0 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61  y->szCell[i];  a
381c0 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20  ssert( sz>0 );. 
381d0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d       if( pFree!=
381e0 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a  (pCell + sz) ){.
381f0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
38200 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
38210 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61  ssert( pFree>aDa
38220 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61  ta && (pFree - a
38230 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  Data)<65536 );. 
38240 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70 61           freeSpa
38250 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
38260 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
38270 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Free);.        }
38280 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
38290 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
382a0 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20  szFree = sz;.   
382b0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 2b 73       if( pFree+s
382c0 7a 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  z>pEnd ) return 
382d0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
382e0 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
382f0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  pCell;.        s
38300 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  zFree += sz;.   
38310 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b     }.      nRet+
38320 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
38330 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
38340 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44  assert( pFree>aD
38350 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20  ata && (pFree - 
38360 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a  aData)<65536 );.
38370 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
38380 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
38390 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
383a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
383b0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70  Ret;.}../*.** ap
383c0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
383d0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
383e0 6e 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69 7a  nters to and siz
383f0 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  es of all cells 
38400 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73 20  in the.** pages 
38410 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20  being balanced. 
38420 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   The current pag
38430 65 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67 2d  e, pPg, has pPg-
38440 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61  >nCell cells sta
38450 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70  rting.** with ap
38460 43 65 6c 6c 5b 69 4f 6c 64 5d 2e