/ Hex Artifact Content
Login

Artifact 7b23553373bcf53137bea4274e06726f10cb7799:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6720: 72 20 61 53 70 61 63 65 5b 33 38 34 5d 3b 20 20  r aSpace[384];  
6730: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6740: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6750: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6760: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6770: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6780: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6790: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
67a0: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
67b0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
67c0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
67d0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
67e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
67f0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
6800: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6810: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6820: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6840: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6850: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6860: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6870: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6880: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6890: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
68a0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
68c0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68d0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
68e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
68f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6900: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6910: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
6920: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6930: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
6940: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
6950: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
6960: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
6970: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
6980: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6990: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
69a0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
69b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
69c0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
69d0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
69e0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
69f0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6a60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6a70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6a80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6a90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6aa0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6ab0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6ac0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6ad0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6ae0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6af0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b50: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6b60: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6b70: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6b80: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6b90: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6ba0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6bd0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6be0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6bf0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c00: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c10: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c20: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c30: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c60: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6c70: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6c80: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6c90: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ca0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cb0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6cc0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6cd0: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6cf0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d00: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d20: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d30: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d40: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6d70: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6d80: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6d90: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6da0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6db0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6dc0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6dd0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6de0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6df0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e00: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e10: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e20: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e30: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e40: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e50: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6e60: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6e70: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6e80: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6e90: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ea0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6eb0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6ec0: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6ed0: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6ee0: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6ef0: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f00: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f10: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f20: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f30: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f40: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f50: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6f60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6f70: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6f80: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6f90: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fa0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6fb0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
6fc0: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
6fd0: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
6fe0: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
6ff0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7000: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7010: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7020: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7030: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7040: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7060: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7070: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7080: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7090: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70a0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70b0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
70c0: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
70d0: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
70e0: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
70f0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7100: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7110: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7120: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7130: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7140: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7150: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7160: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7170: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7180: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7190: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71a0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71b0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
71c0: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
71d0: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
71e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
71f0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7200: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7210: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7220: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7230: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7240: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7250: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7260: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7270: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7290: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72a0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72b0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
72c0: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
72d0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
72e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
72f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7300: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7310: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7320: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7330: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7340: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7350: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7360: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7370: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7380: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7390: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73b0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
73c0: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
73d0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
73e0: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
73f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7400: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7410: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7420: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7430: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7440: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7450: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7460: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7470: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7480: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7490: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74a0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74b0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
74c0: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
74d0: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
74e0: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
74f0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7500: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7510: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7520: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7530: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7540: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7550: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7560: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7570: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7580: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75a0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75b0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
75c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
75d0: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
75e0: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
75f0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7600: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7610: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7620: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7630: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7640: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7660: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7670: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7680: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7690: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76a0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76b0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
76c0: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
76d0: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
76e0: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
76f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7700: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7720: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7730: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7740: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7750: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7760: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7770: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7780: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7790: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77a0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77b0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
77c0: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
77d0: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
77e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
77f0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7800: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7810: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7840: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7850: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7860: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7870: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7880: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7890: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78a0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78b0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
78c0: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
78d0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
78e0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
78f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7900: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7910: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7920: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7930: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7940: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7960: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
7970: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7980: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
7990: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79a0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79b0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
79c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
79d0: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
79e0: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
79f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a00: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a20: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a40: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7a60: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7a70: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7a80: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7a90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7aa0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7ab0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7ac0: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7ad0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7ae0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7af0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b00: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b10: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b20: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b30: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b40: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7b60: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7b70: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7b80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7b90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ba0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bb0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7bc0: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7bd0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c10: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c20: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c30: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c40: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c50: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7c60: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7c70: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7c80: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7c90: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ca0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7cc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ce0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7cf0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d00: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d10: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d40: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d70: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7d80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7d90: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7da0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7db0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7dc0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7dd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7de0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7df0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e00: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e10: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e20: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e30: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e40: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e60: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7e70: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7e80: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7e90: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ea0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7eb0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ec0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7ed0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7ee0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7ef0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f00: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f10: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f30: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f40: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f50: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7f60: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7f70: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7f80: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7f90: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fa0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7fb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7fc0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7fd0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7fe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7ff0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8000: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8010: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8020: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8030: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8040: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8050: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8060: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8070: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8080: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8090: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
80c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
80d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
80e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
80f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8100: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8110: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8120: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8130: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8140: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8150: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8160: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8170: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8180: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8190: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81a0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81b0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
81c0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
81d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
81e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
81f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8200: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8210: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8220: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8230: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8240: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8250: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8260: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8270: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8280: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8290: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82a0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82b0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
82c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
82d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
82e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
82f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8300: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8310: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8320: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8330: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8340: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8350: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8360: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8370: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8380: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8390: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83a0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83b0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
83c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
83d0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
83e0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
83f0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8400: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8410: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8420: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8440: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8450: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8460: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8470: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8480: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8490: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84a0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84b0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
84c0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
84d0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
84e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
84f0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8500: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8510: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8520: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8530: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8540: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8550: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8560: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8570: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8580: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8590: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85a0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85b0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
85c0: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
85d0: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
85e0: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
85f0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8600: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8620: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8630: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8640: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8650: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
8660: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8670: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
8680: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
8690: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86a0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86b0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
86c0: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
86d0: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
86e0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
86f0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8700: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8710: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8720: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8740: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8750: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
8770: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
8780: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
8790: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87a0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87b0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
87c0: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
87d0: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
87e0: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
87f0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8800: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8810: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8820: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8830: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8850: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8870: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8880: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8890: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88b0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
88c0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
88d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
88e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
88f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8900: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8910: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8920: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8930: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8940: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8950: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8960: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8970: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8980: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8990: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89a0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89b0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
89c0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
89d0: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
89e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
89f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a00: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a10: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a20: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a30: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a40: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a50: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8a60: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8a70: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8a80: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8a90: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8aa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8ac0: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8ad0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8ae0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8af0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b00: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b10: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b20: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b30: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b40: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b50: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8b60: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8b70: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8b80: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8b90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8ba0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bb0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8bc0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8bd0: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8be0: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8bf0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c10: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c20: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c30: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8c60: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8c70: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8c80: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8c90: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cb0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8cc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8cd0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8ce0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8cf0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d00: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d50: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8d60: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8d70: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8d80: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8d90: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8da0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8db0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8dc0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8dd0: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8de0: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8df0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e00: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e10: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e20: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e40: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e50: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8e60: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8e70: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8e80: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8e90: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ea0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8eb0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8ec0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8ed0: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8ee0: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8ef0: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f20: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f30: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f40: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f50: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8f60: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f80: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8f90: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fa0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8fb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8fc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8fd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
8fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8ff0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9000: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9020: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9040: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9050: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9060: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9070: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
9080: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
9090: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90a0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
90c0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
90d0: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
90e0: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
90f0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9100: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9110: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9120: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9130: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9140: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9150: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9160: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9170: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9180: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9190: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91a0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91b0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
91c0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
91d0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
91e0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
91f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9200: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9210: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9220: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9230: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9240: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9250: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
9260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9270: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
9280: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
9290: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
92c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
92d0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
92e0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
92f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9300: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9310: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9320: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9330: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9340: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9350: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
9360: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
9370: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
9380: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
9390: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93a0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93b0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
93c0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
93d0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
93e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
93f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9400: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9410: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9420: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9430: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9440: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9450: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9460: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9470: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9480: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
9490: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94a0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94b0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
94c0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
94d0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
94e0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
94f0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9500: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9510: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9530: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9540: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9550: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9560: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
9570: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
9580: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9590: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95a0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95b0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
95c0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95d0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
95e0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
95f0: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9600: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9610: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9620: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9630: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9640: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9660: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
9670: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
9680: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
9690: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96a0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96b0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
96c0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
96d0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
96e0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
96f0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9700: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9710: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9720: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9740: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9750: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9760: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9770: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9780: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9790: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
97c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
97d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
97e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
97f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9800: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9810: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9820: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9830: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9840: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9850: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9860: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9870: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9880: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98a0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98b0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
98c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
98d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
98e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
98f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9910: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9920: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9930: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9940: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9950: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9960: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9980: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9990: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
99d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
99e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a20: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a30: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a50: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9a60: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9a70: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9a80: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9a90: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9aa0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9ab0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9ac0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ae0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9af0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b00: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9b60: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9b70: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9b80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9b90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9ba0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bb0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9bc0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9bd0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9be0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c00: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c10: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c20: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c30: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c50: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9c60: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9c70: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9c80: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9c90: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ca0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9cc0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9cd0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9ce0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9cf0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d00: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d20: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d30: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d40: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d50: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9d60: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9d70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d80: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9d90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9da0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9db0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9dc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9dd0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9de0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9df0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e00: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e40: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e50: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9e60: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9e70: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9e90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ea0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9eb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9ec0: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9ed0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9ee0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9ef0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f00: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f10: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f20: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f30: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f40: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9f60: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9f70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9f80: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9f90: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fa0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9fb0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9fc0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
9fd0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
9fe0: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
9ff0: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a000: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a010: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a020: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a030: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a040: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a050: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a060: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a070: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a080: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a090: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0a0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0b0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a0c0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a0d0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 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 20 20 20 20 2f 2a 20               /* 
a100: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a110: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a150: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a170: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a180: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1a0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1b0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a1c0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a1d0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a1e0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a1f0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a200: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a210: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a220: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a230: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a240: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a250: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a260: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a270: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a280: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a290: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2a0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2b0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a2c0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a2d0: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a2e0: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a2f0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a300: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a310: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a320: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a330: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a340: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a350: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a360: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a370: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a380: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a390: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3b0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a3c0: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a3d0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a3e0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a3f0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a400: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a410: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a420: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a430: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a440: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a450: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a460: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a470: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a480: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a490: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4a0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a4c0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a4d0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a4f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a500: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a510: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a520: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a530: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a540: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a550: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a570: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a580: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a590: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5a0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5b0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a5c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a5d0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a5e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a5f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a600: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a610: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a620: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a630: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a640: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a650: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a660: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a670: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a680: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a690: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6a0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6b0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a6d0: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a6e0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a6f0: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a700: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a710: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a720: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a730: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a740: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a750: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a770: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a780: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7a0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a7d0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a7e0: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a7f0: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a800: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a810: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a820: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a830: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a840: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a850: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a860: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a870: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a880: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a890: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8a0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a8c0: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a8d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a8e0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a8f0: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a900: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a910: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a920: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a930: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a940: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a950: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a960: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a970: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a980: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a990: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9b0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
a9c0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
a9d0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a9e0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
a9f0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa00: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa10: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa20: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa40: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa50: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aa60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aa70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aa80: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aa90: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aaa0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aab0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
aac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aad0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
aae0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
aaf0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab00: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab10: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab20: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab30: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab40: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab50: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
ab60: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
ab70: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
ab80: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
ab90: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
aba0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abb0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
abc0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
abd0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
abe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
abf0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac00: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac20: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac30: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac40: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac50: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
ac60: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
ac70: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
ac80: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
ac90: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
aca0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acb0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
acc0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
acd0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ace0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
acf0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad00: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad10: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad20: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad30: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad40: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad50: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ad60: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
ad70: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
ad80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
ad90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ada0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
adc0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
add0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ade0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
adf0: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae00: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae10: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae20: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae30: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae40: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae50: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
ae60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
ae70: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
ae80: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
ae90: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aea0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aeb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
aec0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
aed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
aee0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af10: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
af60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
af80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
af90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
afb0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
afc0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
afe0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
aff0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b000: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b020: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b030: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b040: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b070: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b080: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b090: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0b0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b0c0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b0d0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b0f0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b100: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b110: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b120: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b130: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b140: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b150: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b160: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b170: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b190: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1b0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b1d0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b1e0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b240: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b250: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b260: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b280: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2c0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2d0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b2e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b2f0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b300: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b310: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b320: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b330: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b340: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b350: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b360: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b370: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b390: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3b0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b3c0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b3d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b3e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b410: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b420: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b430: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b440: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b450: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b460: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b470: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b480: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b490: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4a0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4b0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b4c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b4e0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b4f0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b500: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b510: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b530: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b540: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b580: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b590: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5a0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5b0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b5c0: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b5d0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b5e0: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b5f0: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b600: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b610: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b630: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b640: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b650: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b660: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b670: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b680: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b690: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b6c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b6d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b6e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b6f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b700: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b710: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b720: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b730: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b740: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b750: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b770: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b780: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b790: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b7c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b7d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b7e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b800: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b820: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b830: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b840: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b850: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b860: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b870: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b880: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b890: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b8c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b8d0: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b8e0: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b8f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b910: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b930: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b940: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b950: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b960: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b970: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b980: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b990: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9b0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b9c0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b9d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b9e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b9f0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba00: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba10: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba20: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba40: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba50: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
ba60: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
ba70: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
ba80: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
ba90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
baa0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
bab0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bad0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bae0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
baf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb00: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb10: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb20: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb30: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb40: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb50: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bb60: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bb70: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bb80: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bb90: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bba0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbb0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bbc0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bbd0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bbe0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bbf0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc00: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc10: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc20: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc30: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc40: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc50: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bc60: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bc70: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bc80: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bca0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcb0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bcd0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bce0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bcf0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd00: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd10: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd30: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd40: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd50: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bd60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd80: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bd90: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bda0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdb0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
bdc0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
bdd0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
bde0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
bdf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be10: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be20: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be30: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be40: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
be60: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
be70: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
be80: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
be90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
beb0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bec0: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bed0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bee0: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bef0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf10: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf40: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bf60: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bf70: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bf80: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bf90: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
bfc0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
bfd0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
bfe0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
bff0: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c000: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c010: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c020: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c030: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c040: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c050: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c060: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c070: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c080: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c090: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0b0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c0c0: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c0d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c0e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c0f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c100: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c110: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c120: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c130: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c140: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c150: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c160: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c170: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c180: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c190: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1a0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1b0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c1c0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c1d0: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c1e0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c200: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c210: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c220: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c230: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c240: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c250: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c260: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c270: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c280: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c290: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2a0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2b0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c2c0: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c2d0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c2e0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c2f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c300: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c310: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c320: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c330: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c340: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c350: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c360: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c380: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c390: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3a0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3b0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c3c0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c3d0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c3e0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c3f0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c400: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c420: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c430: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c440: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c450: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c460: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c470: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c490: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4b0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c4c0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c4e0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c4f0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c500: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c510: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c520: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c530: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c540: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c550: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c560: 3b 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 20 20 20 20 2f 2a                /*
c580: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c5d0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c600: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c610: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c620: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c630: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c670: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c680: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c6c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c6d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c6e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c700: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c730: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c740: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c760: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c770: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c780: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c790: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c7c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c7d0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c7e0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c7f0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c800: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c810: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c820: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c830: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c840: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c850: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c860: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c870: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c880: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c890: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8a0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8b0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c8c0: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c8d0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c8e0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c8f0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c900: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c910: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c920: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c930: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c940: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c950: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c960: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c970: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c990: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9a0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9b0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c9c0: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c9d0: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c9e0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c9f0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca00: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
ca60: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
ca70: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
ca80: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
ca90: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
caa0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
cab0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cac0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cad0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
caf0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb00: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb10: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb20: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb30: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb40: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb50: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cb60: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cb70: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cb80: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cb90: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cba0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbb0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cbc0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cbd0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cbe0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cbf0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc00: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc10: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc20: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc30: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cc60: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
cc70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cc80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc90: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cca0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccb0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
ccc0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
ccd0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cce0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
ccf0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd00: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd10: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd20: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd30: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd50: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cd60: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cd70: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cd80: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cd90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cda0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cdc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
cdd0: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
cde0: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
cdf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce00: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce50: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
ce60: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ce70: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
ce80: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ce90: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cea0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ceb0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cec0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
ced0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cee0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cef0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf00: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf10: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf20: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf30: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf40: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cf60: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cf70: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cf80: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cf90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfa0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cfb0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
cfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cfd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
cfe0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
cff0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d000: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d010: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d020: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d030: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d040: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d060: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d080: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d090: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d0c0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d0d0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d0e0: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d0f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d100: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d110: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d120: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d130: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d140: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d150: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d160: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d170: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d180: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d190: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d1c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d1d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d1f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d200: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d210: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d220: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d230: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d240: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d250: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d280: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d290: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d2d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d2e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d320: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d330: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d360: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d370: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d380: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d390: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d3c0: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3e0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d3f0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d400: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d410: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d420: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d440: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d450: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d460: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d470: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d480: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d490: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4b0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d4d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d4f0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d500: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d520: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d530: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d540: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d550: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5b0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d5c0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d5d0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d5e0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d5f0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d600: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d610: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d620: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d630: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d640: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d650: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d660: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d670: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d680: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d690: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6a0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6b0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d6c0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d6d0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d6e0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d6f0: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d700: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d710: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d720: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d750: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d760: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d770: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d780: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d790: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7a0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7b0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d7c0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d7e0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d800: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
d810: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d820: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
d830: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d840: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
d850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d870: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
d880: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8a0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8d0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
d8e0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
d8f0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d900: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d910: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d920: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d930: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d940: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d950: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d960: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d970: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d980: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d990: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d9a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d9b0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d9c0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d9d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d9e0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d9f0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
da00: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
da10: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
da20: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
da30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
da40: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
da50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
da70: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
da80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
da90: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
daa0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
dab0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dac0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
dad0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
dae0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
daf0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
db00: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
db10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
db20: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
db30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
db40: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
db50: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
db60: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
db70: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
db80: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
db90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
dba0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
dbb0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
dbc0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
dbd0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
dbe0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
dbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
dc00: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
dc10: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
dc20: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
dc30: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
dc40: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
dc50: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
dc60: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
dc70: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
dc80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dca0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
dcb0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
dcc0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
dcd0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
dce0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
dcf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd00: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
dd10: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
dd20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dd30: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
dd40: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
dd50: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
dd60: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
dd70: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
dd80: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
dd90: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
dda0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ddb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ddc0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ddd0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
dde0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ddf0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
de00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de10: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
de20: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
de30: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
de40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
de50: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
de60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
de70: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
de80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
de90: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
dea0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
deb0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
dec0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
ded0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
dee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
def0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
df00: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df10: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
df20: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
df30: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
df40: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
df50: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
df60: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
df70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
df80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
df90: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
dfa0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
dfb0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
dfc0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
dfd0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
dfe0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
dff0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
e000: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
e010: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
e020: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
e030: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
e040: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
e050: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
e060: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
e070: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
e080: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e090: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
e0a0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
e0b0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
e0c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e0d0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
e0e0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e0f0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
e100: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
e110: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
e120: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
e130: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
e140: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e150: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
e160: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
e170: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e180: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
e190: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
e1a0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
e1b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e1c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e1d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e1e0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
e1f0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
e200: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
e210: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
e220: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
e230: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
e240: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e250: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
e260: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
e270: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e280: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
e290: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
e2a0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
e2b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e2c0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
e2d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
e2e0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
e2f0: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
e300: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e310: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
e320: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
e330: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e340: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e350: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e360: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
e380: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
e390: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
e3a0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
e3b0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
e3c0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e3d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e3e0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e3f0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e400: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e410: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e420: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e430: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e440: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e450: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e460: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e470: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
e480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e490: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e4a0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
e4b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e4c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e4d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e4e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e4f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e500: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e510: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e520: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e530: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e540: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e550: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e560: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e570: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e580: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e590: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
e5a0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
e5b0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
e5c0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
e5d0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
e5e0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e5f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e600: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e610: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e620: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
e630: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
e640: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
e650: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
e660: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
e670: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e680: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e690: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e6a0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e6c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e6d0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e6e0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e6f0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e700: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
e710: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
e720: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
e730: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e740: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e750: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
e760: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e770: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
e780: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
e790: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
e7a0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
e7b0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
e7c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
e7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e7e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
e7f0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
e800: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
e810: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
e820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e840: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
e850: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
e860: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
e870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e880: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e890: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
e8a0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
e8b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
e8c0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
e8d0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
e8e0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
e8f0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
e900: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
e910: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
e920: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
e930: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
e940: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
e950: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
e960: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
e970: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
e980: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e990: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
e9a0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e9b0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
e9c0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9e0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ea00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea10: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea30: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ea40: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ea50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ea60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ea70: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ea80: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ea90: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
eaa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eab0: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
eac0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ead0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
eae0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
eaf0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
eb00: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
eb10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
eb20: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
eb30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
eb40: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
eb60: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
eb70: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
eb80: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
eba0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ebb0: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ebc0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ebd0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ebe0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ebf0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
ec00: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ec10: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ec20: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
ec30: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
ec40: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
ec50: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ec60: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
ec70: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ec80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ec90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
eca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ecb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ecc0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ecd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ece0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ecf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ed00: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ed10: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ed20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ed30: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ed50: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
ed60: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
ed70: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ed80: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
ed90: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
eda0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
edb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
edc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
edd0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
ede0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
edf0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
ee00: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
ee10: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
ee20: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
ee30: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
ee40: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
ee50: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ee60: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
ee70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ee80: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
ee90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
eea0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
eeb0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
eec0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
eed0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
eee0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
eef0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
ef00: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
ef10: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
ef20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
ef30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ef40: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
ef50: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
ef60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
ef70: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
ef80: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
ef90: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
efa0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
efb0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
efc0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
efd0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
efe0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
eff0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
f000: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
f010: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
f020: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f030: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
f040: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
f050: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
f060: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
f070: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
f080: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
f090: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
f0a0: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
f0b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
f0c0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
f0d0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
f0e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
f0f0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
f100: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f110: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
f120: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
f130: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f140: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
f150: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
f160: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f170: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
f180: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
f190: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
f1a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
f1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
f1c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
f1d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f1f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f200: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
f210: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
f220: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
f230: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
f240: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
f250: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
f260: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
f270: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
f280: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
f290: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
f2a0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
f2b0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
f2c0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
f2d0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
f2e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f2f0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
f300: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
f310: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
f320: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
f330: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
f340: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
f350: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
f360: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
f370: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
f380: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
f390: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
f3a0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
f3b0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
f3c0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
f3d0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
f3e0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
f3f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f400: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
f410: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
f420: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
f430: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
f440: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
f450: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
f460: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
f470: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
f480: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
f490: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
f4a0: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
f4b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
f4c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f4d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
f4e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
f4f0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
f500: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
f510: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
f520: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
f540: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
f550: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
f560: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
f570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f580: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
f590: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f5a0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
f5b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f5c0: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
f5d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
f5e0: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
f5f0: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
f600: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
f610: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f620: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
f630: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f640: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
f650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
f660: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f670: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f680: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6b0: 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
f6c0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
f6d0: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
f6e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f6f0: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
f700: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
f710: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
f720: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f760: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f770: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f780: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
f790: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
f7a0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
f7b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
f7c0: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
f7d0: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
f7e0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f7f0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
f800: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f810: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
f820: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
f830: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
f840: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
f850: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
f860: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
f870: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
f880: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
f890: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
f8a0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
f8b0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
f8c0: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
f8d0: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68   space */.    wh
f8e0: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
f8f0: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
f900: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
f910: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f920: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f930: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
f940: 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
f950: 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
f960: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
f970: 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
f980: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
f990: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
f9a0: 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
f9b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
f9c0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f9d0: 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72     ** Or, the fr
f9e0: 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  eeblock is off t
f9f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
fa00: 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ge.        */.  
fa10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa30: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
fa40: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
fa50: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
fa60: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
fa70: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
fa80: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
fa90: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
faa0: 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
fab0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fac0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
fad0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
fae0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
faf0: 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
fb00: 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
fb10: 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
fb20: 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
fb30: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
fb40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
fb50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fb60: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
fb70: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
fb80: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
fb90: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
fba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
fbb0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
fbc0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
fbd0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
fbe0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
fbf0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
fc00: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
fc10: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
fc20: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
fc30: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
fc40: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
fc50: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
fc60: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
fc70: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
fc80: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
fc90: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
fca0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
fcb0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
fcc0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
fcd0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
fce0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fcf0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
fd00: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
fd10: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
fd20: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
fd30: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
fd40: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
fd50: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
fd60: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
fd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fd80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
fd90: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
fda0: 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
fdb0: 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
fdc0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
fdd0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
fde0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
fe00: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
fe10: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
fe20: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
fe30: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
fe40: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
fe50: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
fe60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
fe70: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
fe80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
fe90: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
fea0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
feb0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
fec0: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
fed0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
fee0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
fef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
ff00: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
ff10: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
ff20: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
ff30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ff40: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ff50: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
ff60: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
ff70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ff80: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ff90: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
ffa0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
ffb0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
ffc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
ffd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
ffe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fff0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10000 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10010 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
10020 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
10030 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10040 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10060 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10070 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10080 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10090 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
100a0 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
100b0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
100c0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
100d0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
100e0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
100f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10100 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
10110 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10120 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
10130 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
10140 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
10150 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
10160 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10170 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
10180 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10190 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
101a0 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
101b0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
101c0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
101d0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
101e0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
101f0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
10200 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
10210 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
10220 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
10230 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
10240 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
10250 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
10260 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
10270 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
10280 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
10290 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
102a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
102b0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
102c0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
102d0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
102e0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
102f0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
10300 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10310 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
10320 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
10330 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
10340 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
10350 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10360 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
10370 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10380 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
10390 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
103a0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
103b0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
103c0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
103d0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
103e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
103f0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
10400 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
10410 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
10420 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
10430 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
10440 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
10450 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10460 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
10470 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10480 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
10490 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
104a0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
104b0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
104c0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
104d0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
104e0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
104f0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
10500 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
10510 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
10520 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
10530 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
10540 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
10550 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
10560 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
10570 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
10580 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
10590 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
105a0 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
105b0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
105c0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
105d0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
105e0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
105f0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
10600 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
10610 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
10620 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10630 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
10640 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
10650 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
10660 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
10670 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
10680 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
10690 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
106a0 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
106b0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
106c0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
106d0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
106e0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
106f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10700 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10710 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
10720 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
10730 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
10740 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
10750 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
10760 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
10770 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
10780 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
10790 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
107a0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
107b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
107c0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
107d0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
107e0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
107f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10800 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
10810 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
10820 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10830 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10840 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10860 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
10870 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10880 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
10890 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
108a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
108b0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
108c0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
108d0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
108e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
108f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
10900 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
10910 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10920 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
10930 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
10940 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
10950 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
10960 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
10970 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10980 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10990 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
109a0 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
109b0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
109c0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
109d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
109e0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
109f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
10a30 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
10a40 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
10a50 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
10a60 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
10a70 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
10a80 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10a90 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10aa0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10ab0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
10ac0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10ae0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
10af0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
10b00 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
10b10 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
10b20 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
10b30 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
10b40 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
10b50 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
10b60 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
10b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
10b80 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
10b90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10ba0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10bb0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10bc0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10bd0 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10be0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10bf0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
10c00 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
10c10 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10c20 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
10c30 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
10c40 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
10c50 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
10c60 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
10c70 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
10c80 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
10c90 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10ca0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10cb0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10cc0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10cd0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10ce0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10cf0 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
10d00 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
10d10 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
10d20 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
10d30 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
10d40 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
10d50 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10d60 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10d70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10d80 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10d90 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10da0 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10db0 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10dc0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10dd0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10df0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
10e00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10e30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
10e40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10e60 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10e70 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10e80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ea0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10eb0 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10ec0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10ef0 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10f00 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10f10 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f30 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10f40 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10f50 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10f60 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10f80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10f90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10fa0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10fb0 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10fc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10fe0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10ff0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
11000 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
11010 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11020 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
11030 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
11040 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
11050 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11060 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11070 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
11080 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11090 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
110a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
110b0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
110c0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
110d0 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
110e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
110f0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11100 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
11110 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
11120 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
11130 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
11140 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
11150 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
11160 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
11170 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11180 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11190 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
111a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
111b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
111c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
111d0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
111e0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
111f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
11200 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
11210 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
11220 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
11230 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
11240 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
11250 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11260 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
11270 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
11280 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
11290 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
112a0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
112b0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
112c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
112d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
112e0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
112f0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
11300 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
11310 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
11320 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
11330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
11340 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11350 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
11360 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Page);.    goto 
11370 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11380 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rror;.  }.  retu
11390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
113a0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
113b0 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20  ror:.  if( pCur 
113c0 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b  ) pCur->iPage--;
113d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
113e0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
113f0 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
11400 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
11410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11420 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
11430 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
11440 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
11450 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
11460 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
11470 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
11480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11490 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
114a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
114b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
114c0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
114d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
114e0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
114f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
11500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11510 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11520 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11530 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11540 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11550 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11560 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11570 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
11580 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
11590 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
115a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
115b0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
115c0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
115d0 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ll(pPage->pDbPag
115e0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
115f0 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
11600 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
11610 20 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c   if( pPage ) rel
11620 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
11630 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
11640 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70   Get an unused p
11650 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
11660 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
11670 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77  btreeGetPage() w
11680 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
11690 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20  :.**.**   *  If 
116a0 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
116b0 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73  ady in use for s
116c0 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
116d0 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  e, immediately.*
116e0 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69  *      release i
116f0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  t and return an 
11700 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65  SQLITE_CURRUPT e
11710 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61  rror..**   *  Ma
11720 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e  ke sure the isIn
11730 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  it flag is clear
11740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11750 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
11760 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
11770 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
11780 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
11790 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
117a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
117b0 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
117c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
117d0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
117e0 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
117f0 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
11800 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
11810 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
11820 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
11830 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
11840 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
11850 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  t rc = btreeGetP
11860 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
11870 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11890 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
118a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
118b0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
118c0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
118d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
118e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
118f0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
11900 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11910 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11920 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
11930 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
11940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
11950 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
11960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11970 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
11980 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
11990 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
119a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
119b0 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
119c0 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
119d0 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
119e0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
119f0 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
11a00 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
11a10 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
11a20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
11a30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11a40 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
11a50 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
11a60 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
11a70 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
11a80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
11a90 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
11aa0 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
11ab0 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
11ac0 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
11ad0 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
11ae0 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
11af0 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
11b00 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
11b10 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11b20 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
11b30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11b40 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
11b50 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
11b60 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
11b70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11b90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11ba0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
11bb0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
11bc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11bd0 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
11be0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
11bf0 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
11c00 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
11c10 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
11c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
11c30 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
11c40 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
11c50 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
11c60 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
11c70 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
11c80 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
11c90 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
11ca0 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
11cb0 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
11cc0 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
11cd0 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
11ce0 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
11cf0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
11d00 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
11d10 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
11d20 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
11d30 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
11d40 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
11d50 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
11d60 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
11d70 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
11d80 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
11d90 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
11da0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11db0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
11dc0 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
11dd0 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
11de0 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
11df0 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
11e00 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
11e10 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
11e20 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
11e30 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
11e40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11e50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11e60 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
11e70 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
11e80 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
11e90 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
11ea0 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
11eb0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
11ec0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
11ed0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
11ee0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
11ef0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
11f00 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
11f10 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
11f20 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11f30 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
11f40 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
11f50 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
11f60 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
11f70 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
11f80 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
11f90 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
11fa0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
11fb0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
11fc0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
11fd0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11fe0 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
11ff0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
12000 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
12010 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
12020 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
12030 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
12040 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
12050 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
12060 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
12070 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
12080 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
12090 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
120a0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
120b0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
120c0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
120d0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
120e0 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
120f0 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
12100 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
12110 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
12120 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
12130 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12140 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
12150 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
12160 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
12170 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
12180 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
12190 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
121a0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
121b0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
121c0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
121d0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
121e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
121f0 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
12200 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
12210 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
12220 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
12230 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
12240 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
12250 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
12260 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
12270 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
12280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12290 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
122a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
122b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
122c0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
122d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
122f0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
12300 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
12310 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
12320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12330 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
12340 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
12350 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
12380 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
12390 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
123a0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
123b0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
123c0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
123d0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
123e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
123f0 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
12400 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
12410 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
12440 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
12450 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
12460 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
12470 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
12480 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
12490 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
124a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
124b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
124c0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
124d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
124e0 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12500 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
12510 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
12520 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
12530 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
12540 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
12550 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
12560 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
12570 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
12580 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
12590 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
125a0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
125b0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
125c0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
125d0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
125e0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
125f0 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
12600 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
12610 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
12620 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
12630 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
12640 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
12650 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
12660 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
12670 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
12680 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
12690 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
126a0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
126b0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
126c0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
126f0 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
12700 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
12730 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
12740 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
12750 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
12760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
12770 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12790 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
127a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
127b0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
127c0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
127d0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
127e0 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
127f0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
12800 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
12810 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
12820 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
12830 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
12840 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
12850 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
12860 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
12870 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
12880 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
12890 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
128a0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
128b0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
128c0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
128d0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
128e0 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
128f0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
12900 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
12910 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
12920 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
12930 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
12940 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
12950 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
12960 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
12970 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
12980 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
12990 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
129a0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
129b0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
129c0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
129d0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
129e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
129f0 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
12a00 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12a10 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
12a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12a30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12a40 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
12a50 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
12a60 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
12a70 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
12a80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
12a90 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
12aa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12ab0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
12ac0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
12ad0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
12ae0 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
12af0 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
12b00 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
12b10 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
12b20 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
12b30 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
12b40 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
12b50 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
12b60 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
12b70 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
12b80 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
12b90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
12ba0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
12bb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
12bc0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
12bd0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
12be0 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
12bf0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
12c00 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12c10 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
12c20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
12c30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
12c40 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
12c50 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
12c60 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
12c70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
12c80 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
12c90 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
12ca0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
12cb0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
12cc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12cd0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cf0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
12d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
12d10 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
12d20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
12d30 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
12d40 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
12d50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12d70 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
12d80 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
12dc0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
12dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12df0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12e00 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
12e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12e20 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
12e50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
12e60 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
12e70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
12e80 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12e90 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
12ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12eb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12ec0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
12ed0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
12ee0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12ef0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12f00 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
12f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12f20 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
12f30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12f40 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
12f50 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
12f60 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
12f70 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
12f80 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
12f90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
12fa0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
12fb0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
12fc0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
12fd0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
12fe0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
12ff0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13000 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
13010 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
13020 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
13030 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
13040 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
13050 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
13060 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
13070 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
13080 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
13090 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
130a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
130b0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
130c0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
130d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
130e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
130f0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
13100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13120 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13140 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13150 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13170 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
13180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13190 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
131a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
131b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
131c0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
131d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
131e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
131f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13200 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13210 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13220 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13230 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
13240 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
13250 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
13260 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
13270 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
13280 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
13290 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
132a0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
132b0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
132c0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
132d0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
132e0 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
132f0 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
13300 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
13310 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
13320 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
13330 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
13340 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
13350 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
13360 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
13370 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
13380 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
13390 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
133a0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
133b0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
133c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
133d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
133e0 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
133f0 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
13400 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
13410 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
13420 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
13430 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
13440 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
13450 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
13460 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
13470 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
13480 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
13490 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
134a0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
134b0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
134c0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
134d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
134e0 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
134f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13500 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
13510 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13520 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
13530 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
13540 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
13550 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
13560 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
13570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13580 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13590 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
135a0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
135b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
135c0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
135d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
135e0 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
13610 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
13620 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
13630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13640 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13650 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13660 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13670 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
13680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13690 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
136a0 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
136b0 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
136c0 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
136d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
136e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
136f0 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
13700 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
13710 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
13720 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
13730 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
13740 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13750 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
13760 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
13770 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13780 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
13790 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
137a0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
137b0 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
137c0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
137d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
137e0 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
137f0 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
13800 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13810 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
13820 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
13830 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
13840 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
13850 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
13860 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
13870 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
13880 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
13890 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
138a0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
138b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
138c0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
138d0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
138e0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
138f0 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
13900 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13920 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
13930 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
13940 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
13950 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
13960 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
13970 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
13980 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
13990 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
139a0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
139b0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
139c0 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
139d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
139e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
139f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13a00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13a10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13a20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
13a30 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
13a40 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
13a50 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
13a60 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
13a70 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
13a80 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
13a90 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
13aa0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
13ab0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
13ac0 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
13ad0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13ae0 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
13af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13b00 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
13b10 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
13b20 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
13b30 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
13b40 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
13b50 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
13b60 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
13b70 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
13b80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13b90 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
13ba0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
13bb0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13bc0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
13bd0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13be0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13bf0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13c00 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13c10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
13c20 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
13c30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13c40 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
13c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c60 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13c70 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
13c80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
13c90 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
13ca0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
13cb0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
13cc0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
13cd0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
13ce0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
13cf0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
13d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13d10 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
13d20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
13d30 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
13d40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13d50 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
13d60 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
13d70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13d80 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
13d90 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13da0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
13db0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
13dc0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
13dd0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
13de0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13df0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13e20 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
13e30 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
13e40 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
13e50 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
13e60 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
13e70 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
13e80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
13e90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
13ea0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
13eb0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
13ec0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
13ed0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
13ee0 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
13ef0 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
13f00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13f10 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13f20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13f30 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13f40 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
13f50 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13f60 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
13f70 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
13f80 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
13f90 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
13fa0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  ;.    if( p->sha
13fb0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13fc0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13fd0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13fe0 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13ff0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
14000 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
14010 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14020 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14030 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
14040 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14050 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
14060 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
14070 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
14080 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
14090 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
140a0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
140b0 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
140c0 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
140d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
140e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
140f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
14100 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14110 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
14120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14130 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14140 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
14150 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
14160 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14170 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14180 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14190 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
141a0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
141b0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
141c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
141d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
141e0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
141f0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
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 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14220 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14230 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
14240 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
14250 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
14260 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
14270 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
14280 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
14290 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
142a0 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
142b0 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
142c0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
142d0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
142e0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
142f0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
14300 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
14310 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14320 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
14330 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
14340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14350 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14360 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
14370 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
14380 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
14390 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
143a0 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
143b0 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
143c0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
143d0 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70    if( (uptr)p->p
143e0 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70  Bt<(uptr)pSib->p
143f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14400 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
14410 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
14420 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
14430 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
14440 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
14450 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
14460 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
14470 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70  && (uptr)pSib->p
14480 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29  Next->pBt<(uptr)
14490 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
144a0 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
144b0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
144c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
144d0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
144e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
144f0 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
14500 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
14510 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
14520 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14530 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
14540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14550 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
14560 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
14570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14590 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
145a0 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
145b0 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
145c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
145d0 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
145e0 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
145f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
14600 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
14610 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
14620 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
14630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14640 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
14650 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
14660 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
14670 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20  ile *pFile;..   
14680 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
14690 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
146a0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
146b0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
146c0 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
146d0 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
146e0 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
146f0 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
14700 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
14710 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
14720 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
14730 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
14740 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
14750 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
14760 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
14770 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14780 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
14790 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
147a0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
147b0 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
147c0 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
147d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
147e0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
147f0 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
14800 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
14810 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
14820 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
14830 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
14840 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74  PDB, (void*)&pBt
14850 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->db);.    }.  }
14860 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
14870 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14880 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14890 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
148a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
148b0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
148c0 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
148d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
148e0 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
148f0 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28  ConnectionCount(
14900 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20  *ppBtree)>0 );. 
14910 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14920 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
14930 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
14940 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
14950 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
14960 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
14970 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
14980 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
14990 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
149a0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
149b0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
149c0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
149d0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
149e0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
149f0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
14a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
14a10 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
14a20 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
14a30 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
14a40 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14a50 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
14a60 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
14a70 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
14a80 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
14a90 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
14aa0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
14ab0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
14ac0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14ad0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
14ae0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
14af0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14b00 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14b10 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
14b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14b30 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
14b40 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
14b50 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
14b60 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
14b70 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14b80 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14b90 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
14ba0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14bb0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14bc0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
14bd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
14be0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
14bf0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14c00 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14c10 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14c20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
14c30 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
14c40 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
14c50 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
14c60 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
14c70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
14c80 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
14c90 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
14ca0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
14cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14cc0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
14cd0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
14ce0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14cf0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
14d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
14d10 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
14d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14d30 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
14d40 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
14d50 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
14d60 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14d70 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
14d80 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
14d90 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
14da0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
14db0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
14dc0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
14dd0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
14de0 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
14df0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
14e00 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
14e10 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
14e20 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
14e30 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14e40 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14e50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14e60 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
14e70 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
14e80 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
14e90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14ea0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
14eb0 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
14ec0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
14ed0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
14ee0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
14ef0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
14f00 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
14f10 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
14f20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
14f30 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
14f40 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
14f50 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
14f60 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
14f70 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
14f80 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
14f90 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
14fa0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
14fb0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
14fc0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
14fd0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
14fe0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
14ff0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15000 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
15010 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
15020 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
15030 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
15040 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
15050 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
15060 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
15070 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
15080 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
15090 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
150a0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
150b0 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
150c0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
150d0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
150e0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
150f0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
15100 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
15110 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
15120 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
15130 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
15140 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
15150 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
15160 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
15170 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
15180 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
15190 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
151a0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
151b0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
151c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
151d0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
151e0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
151f0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
15200 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
15210 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
15220 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
15230 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
15240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15250 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
15260 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
15270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15280 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
15290 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
152a0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
152b0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
152c0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
152d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
152e0 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
152f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
15300 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
15310 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
15320 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
15330 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
15340 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
15350 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
15360 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
15370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15380 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
15390 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
153a0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
153b0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
153c0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
153d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
153e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
153f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15400 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15410 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
15420 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
15430 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
15440 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
15450 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
15460 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15470 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
15480 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
15490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
154a0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
154b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
154c0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
154d0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
154e0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
154f0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
15500 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
15510 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
15520 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
15530 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
15540 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
15550 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
15560 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15570 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
15580 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
15590 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
155a0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
155b0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
155c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
155d0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
155e0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
155f0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
15600 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
15610 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
15620 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
15630 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
15640 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
15650 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
15660 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
15670 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
15680 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
15690 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
156a0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
156b0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
156c0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
156d0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
156e0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
156f0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
15700 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
15710 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
15720 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
15730 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
15740 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15760 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
15770 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
15780 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15790 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b  >pPager, p->db);
157a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
157b0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
157c0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
157d0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
157e0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
157f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15800 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
15810 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
15820 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
15830 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
15840 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
15850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15860 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15870 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
15880 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
15890 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
158a0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
158b0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
158c0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
158d0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
158e0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
158f0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
15900 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
15910 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15930 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
15940 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69  ge the "soft" li
15950 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15960 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15970 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73  e cache..** Unus
15980 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65  ed and unmodifie
15990 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  d pages will be 
159a0 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68  recycled when th
159b0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
159c0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
159d0 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73  e exceeds this s
159e0 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20  oft limit.  But 
159f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
15a00 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f  ** cache is allo
15a10 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67  wed to grow larg
15a20 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d  er than this lim
15a30 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  it if it contain
15a40 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73  s.** dirty pages
15a50 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20   or pages still 
15a60 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a  in active use..*
15a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15a80 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
15a90 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15aa0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15ab0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ad0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15ae0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15af0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15b00 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
15b10 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15b20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15b30 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15b40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
15b70 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c  ge the "spill" l
15b80 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
15b90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15ba0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20  he cache..** If 
15bb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15bc0 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73  ges exceeds this
15bd0 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20   limit during a 
15be0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15bf0 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  n,.** the pager 
15c00 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
15c10 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74   "spill" pages t
15c20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61  o the journal ea
15c30 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20  rly in.** order 
15c40 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
15c50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  y..**.** The val
15c60 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
15c70 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15c80 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20   size.  If zero 
15c90 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  is passed.** as 
15ca0 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20  an argument, no 
15cb0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
15cc0 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69   to the spill si
15cd0 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a  ze setting, so.*
15ce0 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f  * using mxPage o
15cf0 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20  f 0 is a way to 
15d00 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
15d10 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f  t spill size..*/
15d20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d30 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74  eSetSpillSize(Bt
15d40 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
15d50 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
15d60 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15d70 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
15d80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15d90 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
15da0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15db0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15dc0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50    res = sqlite3P
15dd0 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
15de0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15df0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15e00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15e10 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
15e20 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
15e30 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
15e40 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
15e50 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
15e60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15e70 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
15e80 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
15e90 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15ea0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
15eb0 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
15ec0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
15ed0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
15ee0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15f00 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15f20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15f30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15f40 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
15f50 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
15f60 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
15f70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15fa0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15fb0 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
15fc0 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
15fd0 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
15fe0 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
15ff0 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
16000 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
16010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
16020 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
16030 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
16040 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
16050 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
16060 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
16070 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
16080 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
16090 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
160a0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
160b0 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
160c0 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
160d0 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
160e0 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
160f0 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
16100 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
16110 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
16120 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
16130 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
16140 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
16150 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
16160 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
16170 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
16180 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
16190 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
161a0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
161b0 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
161c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
161d0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
161e0 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
161f0 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
16200 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
16210 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
16220 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
16230 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16240 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16250 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16260 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16270 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16280 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16290 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
162a0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
162b0 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
162c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
162d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
162e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
162f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
16300 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
16310 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
16320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16330 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
16340 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
16350 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
16360 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
16370 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
16380 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
16390 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
163a0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
163b0 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
163c0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
163d0 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
163e0 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
163f0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
16400 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
16410 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
16420 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
16430 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
16440 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
16450 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
16460 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
16470 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
16480 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
16490 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
164a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
164b0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
164c0 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
164d0 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
164e0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
164f0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
16500 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
16510 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
16520 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
16530 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
16540 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
16550 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
16560 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
16570 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
16580 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
16590 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
165a0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
165b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
165c0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
165d0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
165e0 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
165f0 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
16600 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
16610 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
16620 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
16630 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16640 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
16650 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16660 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
16670 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
16680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
166a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
166b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
166c0 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
166d0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
166e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
166f0 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
16700 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
16710 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
16720 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
16730 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16740 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
16750 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
16760 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
16770 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
16780 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
16790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
167a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
167b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
167c0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
167d0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
167e0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
167f0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
16800 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
16810 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
16820 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
16830 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
16840 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
16850 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
16860 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
16870 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
16880 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
16890 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
168a0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
168b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
168c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
168d0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
168e0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
168f0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
16900 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
16910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16920 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
16930 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
16940 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
16950 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
16960 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
16970 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
16980 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
16990 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
169a0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
169b0 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
169c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
169d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
169e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
169f0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
16a00 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
16a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16a20 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
16a30 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
16a40 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
16a50 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
16a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
16a70 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
16a80 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
16a90 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
16aa0 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
16ab0 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
16ac0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16ad0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
16ae0 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
16af0 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
16b00 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
16b10 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
16b20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
16b30 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
16b40 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
16b50 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
16b60 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
16b70 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
16b80 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
16b90 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
16ba0 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
16bb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
16bc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16bd0 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
16be0 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
16bf0 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
16c00 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
16c10 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
16c20 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
16c30 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
16c40 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
16c50 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
16c60 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16c70 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
16c80 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16cb0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
16cc0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
16cd0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
16ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
16cf0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
16d00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16d10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16d20 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
16d30 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
16d40 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
16d50 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
16d60 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
16d70 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
16d80 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
16d90 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
16da0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
16db0 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
16dc0 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
16dd0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16de0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
16df0 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
16e00 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
16e10 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
16e20 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
16e30 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
16e40 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
16e50 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
16e60 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
16e70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
16e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16e90 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
16ea0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16eb0 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
16ec0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16ed0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
16ee0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16ef0 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
16f00 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
16f10 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
16f20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
16f40 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
16f50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16f60 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
16f70 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
16f80 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
16f90 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
16fa0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
16fb0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
16fc0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
16fd0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
16fe0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
16ff0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17010 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
17020 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
17030 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
17040 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17050 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
17060 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
17070 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
17080 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
17090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
170a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
170b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
170c0 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
170d0 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
170e0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
170f0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
17100 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
17110 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
17120 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
17130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17140 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17150 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
17160 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
17170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17180 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
17190 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
171a0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
171b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
171c0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
171d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
171e0 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
171f0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
17200 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
17210 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
17220 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
17230 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
17240 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
17250 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
17260 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
17270 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
17280 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
17290 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
172a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
172b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
172c0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
172d0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
172e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
172f0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
17300 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
17310 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
17320 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
17330 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
17340 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
17350 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
17360 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
17370 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
17380 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
17390 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
173a0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
173b0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
173c0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
173d0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
173e0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
173f0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
17400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17410 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
17420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17430 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
17440 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17450 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
17460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17470 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
17480 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
17490 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
174a0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
174b0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
174c0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
174d0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
174e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
174f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
17500 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
17510 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
17520 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
17530 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
17540 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
17550 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
17560 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17570 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
17580 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
17590 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
175a0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
175b0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
175c0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
175d0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
175e0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
175f0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
17600 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
17610 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
17620 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17640 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
17650 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
17660 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
17670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17680 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
17690 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
176a0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
176b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
176c0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
176d0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
176e0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
176f0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
17700 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
17710 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17720 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17730 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
17740 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
17750 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
17760 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
17770 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
17780 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
17790 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
177a0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
177b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
177c0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
177d0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
177e0 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
177f0 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
17800 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
17810 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
17820 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
17830 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
17840 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
17850 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
17860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
17870 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
17880 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
17890 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
178a0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
178b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
178c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
178d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
178e0 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
178f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
17900 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
17910 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
17920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17930 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
17940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17950 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17960 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
17970 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
17980 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
17990 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
179a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
179b0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
179c0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
179d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
179e0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
179f0 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
17a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17a10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17a20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17a30 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
17a40 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
17a50 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
17a60 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
17a70 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17a80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17a90 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
17aa0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
17ab0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
17ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17ad0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
17ae0 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
17af0 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
17b00 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
17b10 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
17b20 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
17b30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
17b40 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
17b50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
17b60 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
17b70 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
17b80 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
17b90 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
17ba0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
17bb0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
17bc0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
17bd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
17be0 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
17bf0 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
17c00 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
17c10 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
17c20 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
17c30 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
17c40 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
17c50 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
17c60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
17c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17c80 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
17c90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
17ca0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
17cb0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
17cc0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
17cd0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
17ce0 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
17cf0 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
17d00 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
17d10 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
17d20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
17d30 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
17d40 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
17d50 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
17d60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
17d70 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17d80 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
17d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
17da0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
17db0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
17dc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17dd0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
17de0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
17df0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
17e00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17e10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17e20 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
17e30 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
17e40 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17e50 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
17e60 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17e70 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
17e80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17e90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17ea0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17eb0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
17ec0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
17ed0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
17ee0 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
17ef0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
17f00 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
17f10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
17f20 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
17f30 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
17f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
17f50 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
17f60 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
17f70 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
17f80 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
17f90 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
17fa0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
17fb0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
17fc0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
17fd0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
17fe0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
17ff0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
18000 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
18010 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
18020 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
18030 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
18040 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
18050 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
18060 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18070 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
18080 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
18090 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
180a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
180b0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
180c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
180d0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
180e0 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
180f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18110 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18120 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18130 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c    }else{.#if SQL
18140 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18150 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
18160 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18170 48 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20  HRONOUS.        
18180 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
18190 20 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20       Db *pDb;.  
181a0 20 20 20 20 20 20 69 66 28 20 28 64 62 3d 70 42        if( (db=pB
181b0 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
181c0 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
181d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
181e0 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pDb->pBt==0 ||
181f0 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d   pDb->pBt->pBt!=
18200 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a  pBt ){ pDb++; }.
18210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 44            if( pD
18220 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20  b->bSyncSet==0. 
18230 20 20 20 20 20 20 20 20 20 20 26 26 20 70 44 62            && pDb
18240 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d  ->safety_level==
18250 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18260 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20  YNCHRONOUS+1.   
18270 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
18280 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
18290 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45  y_level = SQLITE
182a0 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
182b0 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20  CHRONOUS+1;.    
182c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
182d0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
182e0 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
182f0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
18300 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
18310 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
18320 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
18330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18340 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18350 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30     if( isOpen==0
18360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18370 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
18380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
18390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
183a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
183b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
183c0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
183d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
183e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
183f0 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
18400 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
18410 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
18420 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
18430 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
18440 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
18450 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
18460 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
18470 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18480 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
18490 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
184a0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
184b0 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
184c0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
184d0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
184e0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
184f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
18500 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
18510 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
18520 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
18530 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18540 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18550 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18560 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
18570 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
18580 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
18590 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
185a0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
185b0 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
185c0 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
185d0 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
185e0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
185f0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
18600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
18610 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
18620 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
18630 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
18640 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
18650 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
18660 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
18670 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
18680 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
18690 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
186a0 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
186b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
186c0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
186d0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
186e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
186f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
18700 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
18710 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
18720 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18730 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18740 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
18750 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
18760 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18770 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
18780 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
18790 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
187a0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
187b0 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
187c0 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
187d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
187e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
187f0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
18800 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
18810 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
18820 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
18830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
18840 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
18850 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
18860 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
18870 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18880 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
18890 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
188a0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
188b0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
188c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
188d0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
188e0 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
188f0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
18900 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
18910 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
18920 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
18930 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
18940 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
18950 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
18960 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
18970 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
18980 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
18990 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
189a0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
189b0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
189c0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
189d0 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
189e0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
189f0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
18a00 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
18a10 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
18a20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
18a30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
18a40 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
18a50 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
18a60 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
18a70 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
18a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
18a90 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18aa0 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
18ab0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
18ac0 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
18ad0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
18ae0 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
18af0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
18b00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18b10 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
18b20 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
18b30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
18b70 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
18b80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18b90 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
18ba0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
18bb0 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
18bc0 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
18bd0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
18be0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18bf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
18c00 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18c10 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
18c20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18c30 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
18c40 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
18c50 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
18c60 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
18c70 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
18c80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
18c90 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
18ca0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
18cb0 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
18cc0 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
18cd0 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
18ce0 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
18cf0 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
18d00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18d10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18d20 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
18d30 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18d40 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
18d50 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
18d60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18d70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18d80 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
18d90 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
18da0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
18db0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
18dc0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
18dd0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
18de0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
18df0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
18e00 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
18e10 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
18e20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
18e30 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
18e40 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
18e50 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
18e60 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
18e70 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
18e80 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
18e90 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
18ea0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
18eb0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
18ec0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
18ed0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
18ee0 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
18ef0 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
18f00 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
18f10 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
18f20 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
18f30 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
18f40 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
18f50 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
18f60 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
18f70 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
18f80 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
18f90 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
18fa0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
18fb0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
18fc0 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
18fd0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
18fe0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
18ff0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
19000 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
19010 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
19020 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
19030 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
19040 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
19050 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
19060 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19070 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
19080 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
19090 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
190a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
190b0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
190c0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
190d0 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
190e0 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
190f0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
19100 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
19110 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
19120 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
19130 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
19140 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
19150 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
19160 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
19170 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19180 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
19190 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
191a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
191b0 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
191c0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
191d0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
191e0 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
191f0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
19200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19210 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
19220 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
19230 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
19240 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
19250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19260 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
19270 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19280 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
19290 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
192a0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
192b0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
192c0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
192d0 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
192e0 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
192f0 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
19300 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
19310 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
19320 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
19330 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
19340 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
19350 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
19360 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
19370 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
19380 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
19390 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
193a0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
193b0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
193c0 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
193d0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
193e0 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20  abase.  Cursors 
193f0 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
19400 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
19410 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
19420 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
19430 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
19440 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
19450 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
19460 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
19470 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
19480 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
19490 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
194a0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
194b0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
194c0 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
194d0 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
194e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
194f0 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
19500 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
19510 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
19520 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
19530 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
19540 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
19550 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
19560 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
19570 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
19580 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
19590 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
195a0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
195b0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
195c0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
195d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
195e0 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
195f0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
19600 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
19610 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
19620 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
19630 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
19640 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
19650 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19660 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
19670 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19680 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
19690 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
196a0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
196b0 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
196c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
196d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
196e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
196f0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
19700 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
19710 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
19720 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
19730 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
19740 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
19750 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
19760 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50  1!=0 ){.    MemP
19770 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
19780 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61  t->pPage1;.    a
19790 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61  ssert( pPage1->a
197a0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
197b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
197c0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
197d0 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
197e0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
197f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
19800 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b  NotNull(pPage1);
19810 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
19820 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
19830 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
19840 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
19850 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
19860 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
19870 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
19880 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
19890 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
198a0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
198b0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
198c0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
198d0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
198e0 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
198f0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
19900 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
19910 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19920 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19930 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
19940 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
19950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19960 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
19970 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
19980 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
19990 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
199a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
199b0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
199c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
199d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
199e0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
199f0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
19a00 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
19a10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
19a20 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
19a30 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
19a40 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
19a50 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
19a60 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
19a70 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
19a80 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
19a90 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
19aa0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
19ab0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19ac0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
19ad0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
19ae0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
19af0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
19b00 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
19b10 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
19b20 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
19b30 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
19b40 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
19b50 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
19b60 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
19b70 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
19b80 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
19b90 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
19ba0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
19bb0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
19bc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
19bd0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
19be0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
19bf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
19c00 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
19c10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
19c20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
19c30 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
19c40 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
19c50 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
19c60 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
19c70 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
19c80 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
19c90 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
19ca0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
19cb0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
19cc0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
19cd0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
19ce0 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
19cf0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
19d00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19d10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
19d20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19d40 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
19d50 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
19d60 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
19d70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
19d80 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
19d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
19da0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
19db0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
19dc0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
19dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19de0 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
19df0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
19e00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19e10 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
19e20 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
19e30 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
19e40 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
19e50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19e60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e70 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
19e80 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
19e90 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
19ea0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
19eb0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
19ec0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19ed0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
19ee0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
19ef0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
19f00 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
19f10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
19f20 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
19f30 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
19f40 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
19f50 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
19f60 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
19f70 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
19f80 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
19f90 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
19fa0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
19fb0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
19fc0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
19fd0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
19fe0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
19ff0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1a000 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1a010 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1a020 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1a030 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1a040 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1a050 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1a060 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1a070 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1a080 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a090 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1a0a0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1a0b0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1a0c0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1a0d0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1a0e0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1a0f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1a100 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1a110 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a120 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1a130 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a140 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1a150 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a160 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1a170 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a180 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1a190 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a1a0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1a1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1a1c0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1a1d0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1a1e0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1a1f0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1a200 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1a210 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1a220 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1a230 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1a240 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1a250 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1a260 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1a270 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1a280 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1a290 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1a2a0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1a2b0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1a2c0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1a2d0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1a2e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1a2f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1a300 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1a310 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1a320 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1a330 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1a340 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1a350 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1a360 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1a370 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1a380 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1a390 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1a3a0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1a3b0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1a3c0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1a3d0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1a3e0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1a3f0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1a400 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1a410 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1a420 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1a430 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1a440 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1a450 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1a460 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1a470 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1a480 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1a490 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1a4a0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1a4b0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1a4c0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1a4d0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1a4e0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1a4f0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1a500 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1a510 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a520 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1a530 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
1a540 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a550 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1a560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1a570 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a580 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1a590 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1a5a0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1a5b0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1a5c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1a5d0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1a5e0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1a5f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1a600 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a610 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1a620 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1a630 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1a640 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a650 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1a660 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1a670 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1a680 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1a690 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1a6a0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1a6b0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1a6c0 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1a6d0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1a6e0 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1a6f0 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1a700 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1a710 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1a720 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1a730 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1a740 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1a750 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1a760 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1a770 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1a780 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1a790 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1a7a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a7b0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1a7c0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1a7d0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1a7e0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1a7f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1a800 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1a810 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1a820 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1a830 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1a840 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1a850 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1a860 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1a870 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1a880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1a890 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1a8a0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1a8b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a8c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1a8d0 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1a8e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1a8f0 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1a900 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1a910 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1a920 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a930 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1a940 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1a950 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1a960 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1a970 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1a980 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1a990 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1a9a0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1a9b0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1a9c0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1a9d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a9f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1aa00 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1aa10 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1aa20 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1aa30 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1aa40 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1aa50 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1aa60 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1aa70 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1aa80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1aa90 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1aaa0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1aab0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1aac0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1aad0 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1aae0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1aaf0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1ab00 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1ab10 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1ab20 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1ab30 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1ab40 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1ab50 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1ab60 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1ab70 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1ab80 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1ab90 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1aba0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1abb0 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1abc0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1abd0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1abe0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1abf0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1ac00 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1ac10 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1ac20 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1ac30 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1ac40 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1ac50 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1ac60 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1ac70 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1ac80 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1ac90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1aca0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1acb0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1acc0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1acd0 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1ace0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1acf0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1ad00 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1ad10 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1ad20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ad30 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1ad40 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1ad50 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1ad60 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1ad70 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1ad80 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1ad90 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1ada0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1adb0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1adc0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1add0 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1ade0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1adf0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1ae00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ae20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1ae30 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1ae40 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1ae50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ae60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1ae70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ae80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ae90 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1aea0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1aeb0 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1aec0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1aed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1aee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aef0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1af00 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1af10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1af20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1af30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1af40 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1af50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1af60 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1af70 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1af80 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1af90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1afa0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1afb0 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1afc0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1afd0 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1afe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aff0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b000 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1b010 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1b020 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1b030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1b040 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1b050 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1b060 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b070 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1b080 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1b090 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1b0a0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1b0b0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1b0c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1b0d0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1b0e0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1b0f0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1b100 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1b110 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1b120 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1b130 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1b140 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1b150 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1b160 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b170 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1b180 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1b190 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1b1a0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1b1b0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1b1c0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1b1d0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1b1e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1b1f0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1b200 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1b210 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1b220 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1b230 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1b240 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1b250 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1b260 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1b270 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b280 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1b290 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1b2a0 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1b2b0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1b2c0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1b2d0 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1b2e0 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1b2f0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1b300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b310 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1b320 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1b330 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1b340 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1b350 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1b360 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1b370 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1b380 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1b390 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1b3a0 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1b3b0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1b3c0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1b3d0 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1b3e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1b3f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b400 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1b410 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1b420 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1b430 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b440 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1b450 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1b460 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1b470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b480 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1b490 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1b4a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1b4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b4c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1b4d0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1b4e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b4f0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1b500 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1b510 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1b520 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1b530 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1b540 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1b550 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1b560 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1b570 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1b580 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1b590 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1b5a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1b5b0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1b5c0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1b5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1b5f0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1b600 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
1b610 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
1b620 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1b630 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
1b640 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1b660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b670 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1b680 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
1b690 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
1b6a0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
1b6b0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
1b6c0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
1b6d0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
1b6e0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
1b6f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1b700 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
1b710 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
1b720 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
1b730 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
1b740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
1b750 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
1b760 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1b770 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
1b7a0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
1b7b0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1b7e0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1b820 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
1b830 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1b840 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
1b850 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1b860 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
1b870 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1b880 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
1b890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b8a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1b8b0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
1b8c0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1b8d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1b8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8f0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
1b900 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
1b910 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1b920 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
1b930 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1b940 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
1b950 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1b960 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
1b970 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
1b980 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
1b990 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
1b9a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1b9b0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1b9c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1b9d0 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
1b9e0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1b9f0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1ba00 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
1ba10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
1ba20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1ba30 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1ba40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1ba50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1ba60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1ba70 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1ba80 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1ba90 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1baa0 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
1bab0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
1bac0 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
1bad0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
1bae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1baf0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
1bb00 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
1bb10 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
1bb20 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
1bb30 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
1bb40 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1bb50 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
1bb60 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
1bb70 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
1bb80 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
1bb90 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
1bba0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
1bbb0 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
1bbc0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1bbd0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1bbe0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
1bbf0 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
1bc00 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
1bc10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1bc20 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
1bc30 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1bc40 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1bc50 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
1bc60 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1bc80 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
1bc90 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
1bca0 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
1bcb0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1bcc0 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
1bcd0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
1bce0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1bcf0 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
1bd20 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
1bd30 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
1bd40 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
1bd50 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
1bd60 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
1bd70 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
1bd80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bd90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1bda0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1bdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1bdc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1bdd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
1bde0 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
1bdf0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1be00 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
1be10 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
1be20 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
1be30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
1be40 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1be50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
1be60 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1be70 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
1be80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1be90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1bea0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1beb0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1bec0 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1bed0 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
1bee0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
1bef0 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
1bf00 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1bf10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1bf20 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1bf30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
1bf40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1bf50 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
1bf60 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
1bf70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1bf80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
1bf90 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1bfa0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
1bfb0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1bfc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1bfd0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
1bfe0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
1bff0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
1c000 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
1c010 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
1c020 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
1c030 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a  l<info.nPayload.
1c040 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
1c050 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d  l+info.nSize-1<=
1c060 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1c070 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
1c080 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
1c090 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1c0a0 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20 20 20  nfo.nSize-4).   
1c0b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1c0c0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1c0d0 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69  +info.nSize-4, i
1c0e0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1c0f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1c100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c110 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1c120 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1c130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c140 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1c150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1c160 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1c170 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c180 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1c190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1c1a0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1c1b0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1c1c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c1d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c1e0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1c1f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1c200 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c210 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1c220 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c230 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c240 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c250 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1c260 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1c270 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1c280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c2a0 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1c2b0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c2c0 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1c2d0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1c2e0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1c2f0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1c300 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1c310 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1c320 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1c330 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1c340 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1c350 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1c360 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1c370 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1c380 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1c390 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1c3a0 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1c3b0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1c3c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1c3d0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1c3e0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1c3f0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1c400 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1c410 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1c420 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1c430 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1c440 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1c450 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1c460 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1c470 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c490 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1c4a0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1c4b0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1c4c0 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1c4d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1c4e0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1c4f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c500 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1c510 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1c520 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1c530 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1c540 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1c550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1c560 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1c570 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1c580 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1c590 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1c5a0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1c5b0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1c5c0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1c5d0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c5e0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1c5f0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1c600 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1c610 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1c620 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1c630 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c640 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1c650 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c660 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1c670 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1c680 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c690 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1c6a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c6b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1c6c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1c6d0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1c6e0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1c6f0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1c700 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1c710 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1c720 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1c730 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1c740 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1c750 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1c760 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1c770 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1c780 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1c790 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1c7a0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1c7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c7c0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1c7d0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1c7e0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1c7f0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1c800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c810 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c820 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1c830 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1c840 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1c850 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1c860 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1c870 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1c880 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1c890 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1c8a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1c8b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1c8c0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1c8d0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1c8e0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1c8f0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1c900 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1c910 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1c920 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1c930 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1c940 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1c950 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1c960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1c970 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1c980 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1c990 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1c9a0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1c9b0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1c9c0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c9d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1c9e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1c9f0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1ca00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1ca10 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1ca20 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1ca30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ca40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ca60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ca70 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1ca80 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1ca90 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1caa0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1cab0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1cac0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1cad0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1cae0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1caf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1cb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cb20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb30 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1cb40 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1cb50 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1cb60 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1cb70 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1cb80 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1cb90 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1cba0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1cbb0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1cbc0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1cbd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1cbe0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1cbf0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1cc00 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1cc10 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1cc20 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1cc30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cc40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cc50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1cc60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cc70 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1cc80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1cc90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cca0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1ccb0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1ccc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ccd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1cce0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1ccf0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1cd00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1cd10 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1cd20 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1cd30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1cd40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cd50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1cd60 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1cd70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1cd80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1cd90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1cda0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1cdb0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1cdc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1cdd0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1cde0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1cdf0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1ce00 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1ce10 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1ce20 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1ce30 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1ce40 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1ce50 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1ce60 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1ce70 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1ce80 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1ce90 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1cea0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1ceb0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1cec0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1ced0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1cee0 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1cef0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1cf00 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1cf10 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1cf20 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1cf30 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1cf40 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1cf50 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1cf60 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1cf70 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1cf80 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1cf90 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1cfa0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1cfb0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1cfc0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1cfd0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1cfe0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1cff0 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1d000 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1d010 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1d020 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1d030 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1d040 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1d050 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1d060 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1d070 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1d080 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1d090 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1d0a0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1d0b0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1d0c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1d0d0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1d0e0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1d0f0 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1d100 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1d110 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1d120 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1d130 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1d140 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1d150 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1d160 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1d170 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1d180 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1d190 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1d1a0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1d1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d1c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1d1d0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1d1e0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1d1f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d200 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d220 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1d230 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1d240 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1d250 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1d260 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1d270 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1d280 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1d290 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1d2a0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1d2b0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1d2c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d2d0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1d2e0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1d2f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d300 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1d310 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d320 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1d330 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1d340 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1d350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1d380 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1d390 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1d3a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1d3b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1d3c0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d3d0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1d3e0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1d3f0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1d400 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1d410 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1d420 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1d430 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1d440 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1d450 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1d460 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1d470 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1d480 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1d490 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1d4a0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1d4b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1d4c0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1d4d0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1d4e0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1d4f0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1d500 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1d510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1d520 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1d530 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1d540 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1d550 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1d560 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1d570 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1d580 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1d590 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1d5a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d5b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d5c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d5e0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1d5f0 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1d600 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d610 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1d620 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1d630 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1d640 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1d650 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1d660 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1d670 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1d680 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1d690 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1d6a0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1d6b0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1d6c0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1d6d0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1d6e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1d6f0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1d700 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1d710 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1d720 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1d730 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1d740 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1d750 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1d760 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1d770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d790 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1d7a0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1d7b0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1d7c0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1d7d0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1d7e0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1d7f0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1d800 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1d810 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1d820 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1d830 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1d840 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1d850 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1d860 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1d870 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1d880 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1d890 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1d8a0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1d8b0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1d8c0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1d8d0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1d8e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1d8f0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d900 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1d910 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1d920 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1d930 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1d940 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1d950 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1d960 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1d970 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d980 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1d990 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1d9a0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1d9b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d9c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d9d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1d9e0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1d9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1da00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1da10 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1da20 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1da30 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1da40 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1da50 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1da60 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1da70 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1da80 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1da90 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1daa0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1dab0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1dac0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1dad0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1dae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1daf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1db00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1db10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1db20 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1db30 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1db40 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1db50 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1db60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1db70 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1db80 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1db90 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1dba0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1dbb0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1dbc0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1dbd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dbe0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1dbf0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1dc00 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1dc10 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1dc20 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1dc30 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1dc40 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1dc50 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1dc60 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1dc70 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1dc80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1dc90 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1dca0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1dcb0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1dcc0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1dcd0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1dce0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1dcf0 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1dd00 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dd30 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1dd40 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1dd50 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1dd80 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1dd90 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1dda0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ddc0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ddd0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1dde0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1ddf0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1de00 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1de10 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1de20 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1de30 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1de40 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1de50 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1de60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1de70 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1de80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1de90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1dea0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1deb0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1dec0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1ded0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1dee0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1def0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1df00 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1df10 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1df20 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1df30 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1df40 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1df50 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1df60 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1df70 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1df80 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1df90 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1dfa0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1dfb0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1dfc0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1dfd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1dfe0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1dff0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1e000 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1e010 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1e020 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1e030 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e040 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1e050 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1e060 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1e070 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1e080 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1e090 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1e0a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e0b0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1e0c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1e0d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1e0e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1e0f0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1e100 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1e110 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1e120 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1e130 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1e140 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1e150 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1e160 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1e170 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1e180 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1e190 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e1a0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1e1b0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1e1c0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1e1d0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1e1e0 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1e1f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e220 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1e230 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1e240 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e250 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e270 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1e280 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1e290 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1e2a0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1e2b0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1e2c0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1e2d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e2f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e300 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1e310 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1e320 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e330 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e340 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1e350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1e360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e370 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1e380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1e390 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e3a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1e3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e3c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e3d0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1e3e0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1e3f0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1e400 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1e410 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1e420 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1e430 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1e440 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1e450 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1e460 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1e470 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1e480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1e490 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1e4a0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1e4b0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1e4c0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1e4d0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1e4e0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1e4f0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1e500 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1e510 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1e520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1e530 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1e540 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1e550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e560 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1e570 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1e580 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1e590 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1e5a0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1e5b0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1e5c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e5d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e5e0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1e5f0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1e600 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1e610 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1e620 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1e630 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1e640 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1e650 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e660 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1e670 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1e680 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1e690 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1e6a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e6b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1e6c0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1e6d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1e6e0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1e6f0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1e700 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1e710 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1e720 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1e730 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1e740 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1e750 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1e760 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1e770 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1e780 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1e790 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1e7a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e7b0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1e7c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1e7d0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1e7e0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1e7f0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1e800 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1e810 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1e820 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1e830 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1e840 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1e850 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1e860 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1e870 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e890 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e8a0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1e8b0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1e8c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e8d0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1e8e0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1e8f0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1e900 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1e910 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e920 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e930 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1e940 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1e950 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1e960 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1e970 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1e980 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1e990 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1e9a0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1e9b0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1e9c0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1e9d0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1e9e0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1e9f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1ea00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1ea10 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1ea20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ea30 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1ea40 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1ea50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ea60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ea70 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1ea80 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ea90 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1eaa0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1eab0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1eac0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1ead0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1eae0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1eaf0 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1eb00 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1eb10 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1eb20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1eb40 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1eb50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1eb60 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1eb70 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1eb80 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1eb90 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1eba0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1ebb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ebc0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1ebd0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1ebe0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1ebf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ec00 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1ec10 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
1ec20 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
1ec30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1ec40 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
1ec50 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
1ec60 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
1ec70 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1ec80 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
1ec90 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
1eca0 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
1ecb0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
1ecc0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
1ecd0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1ece0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1ecf0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1ed00 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
1ed10 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
1ed20 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
1ed30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ed40 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
1ed50 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
1ed60 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
1ed70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1ed80 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
1ed90 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
1eda0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
1edb0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1edc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1edd0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
1ede0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
1edf0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
1ee00 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
1ee10 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
1ee20 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
1ee30 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
1ee40 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
1ee50 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
1ee60 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1ee70 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
1ee80 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
1ee90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1eea0 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
1eeb0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
1eec0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
1eed0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
1eee0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
1eef0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
1ef00 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1ef10 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
1ef20 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ef30 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
1ef40 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1ef50 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
1ef60 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
1ef70 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1ef80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ef90 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1efa0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1efb0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
1efc0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
1efd0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
1efe0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
1eff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
1f000 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
1f010 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1f020 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1f030 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1f040 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
1f050 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
1f060 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
1f070 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
1f080 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
1f090 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
1f0a0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1f0b0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
1f0c0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
1f0d0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
1f0e0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
1f0f0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
1f100 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f110 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1f120 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
1f130 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1f140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f150 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1f160 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
1f170 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1f180 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1f1a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1f1b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1f1c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1f1d0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1f1e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1f1f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f200 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f210 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1f220 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
1f230 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
1f240 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
1f250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1f270 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f280 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
1f290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f2a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1f2b0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
1f2c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1f2d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1f2e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1f2f0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1f300 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
1f310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1f320 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
1f330 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
1f340 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1f350 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f380 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f390 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1f3a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f3b0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1f3c0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1f3d0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1f3e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1f3f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1f400 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1f410 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1f420 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1f430 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1f440 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1f450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1f460 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1f470 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1f480 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f490 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1f4a0 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1f4b0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1f4c0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1f4d0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1f4e0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1f4f0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1f500 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1f510 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1f520 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1f530 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1f540 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1f550 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1f560 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1f570 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1f580 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1f590 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1f5a0 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1f5b0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1f5c0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f5d0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1f5e0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1f5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f600 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1f610 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1f620 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1f630 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1f640 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1f650 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1f660 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1f670 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1f680 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1f690 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1f6a0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1f6b0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1f6c0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1f6d0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
1f6e0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
1f6f0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
1f700 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
1f710 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
1f720 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
1f730 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1f740 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1f750 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1f760 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
1f770 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
1f780 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1f790 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1f7a0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1f7b0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
1f7c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1f7d0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1f7e0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
1f7f0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
1f800 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
1f810 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
1f820 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
1f830 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
1f840 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1f850 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
1f860 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
1f870 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
1f880 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1f890 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1f8a0 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
1f8b0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
1f8c0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
1f8d0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
1f8e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f8f0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
1f900 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1f910 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
1f920 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
1f930 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f940 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
1f950 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1f960 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
1f970 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
1f980 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1f990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1f9a0 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
1f9b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1f9c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
1f9d0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
1f9e0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
1f9f0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
1fa00 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
1fa10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
1fa20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
1fa30 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
1fa40 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
1fa50 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
1fa60 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
1fa70 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
1fa80 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
1fa90 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
1faa0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1fab0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
1fac0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1fad0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
1fae0 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
1faf0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1fb00 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1fb10 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
1fb20 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
1fb30 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
1fb40 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
1fb50 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
1fb60 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
1fb70 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
1fb80 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
1fb90 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
1fba0 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
1fbb0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
1fbc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1fbd0 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
1fbe0 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
1fbf0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
1fc00 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
1fc10 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
1fc20 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
1fc30 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
1fc40 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1fc50 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
1fc60 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
1fc70 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
1fc80 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
1fc90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
1fca0 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
1fcb0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
1fcc0 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
1fcd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1fce0 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
1fcf0 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
1fd00 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
1fd10 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
1fd20 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1fd30 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
1fd40 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
1fd50 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
1fd60 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
1fd70 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
1fd80 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
1fd90 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
1fda0 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
1fdb0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1fdc0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1fdd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fde0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1fdf0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1fe00 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1fe10 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1fe20 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1fe30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1fe40 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
1fe50 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
1fe60 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
1fe70 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1fe80 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
1fe90 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
1fea0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1feb0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1fec0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1fed0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
1fee0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1fef0 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
1ff00 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
1ff10 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ff20 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
1ff30 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1ff40 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
1ff50 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1ff60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ff70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1ff80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ff90 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1ffa0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1ffb0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1ffc0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
1ffd0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
1ffe0 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
1fff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
20000 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
20010 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
20020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20030 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
20040 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20050 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20060 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20070 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
20080 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
20090 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
200a0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
200b0 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
200c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
200d0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
200e0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
200f0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
20100 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
20110 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
20120 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20130 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
20140 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20150 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
20160 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
20170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20180 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
20190 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
201a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
201b0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
201c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
201d0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
201e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
201f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
20200 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20210 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
20220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
20230 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20240 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20250 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20260 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
20270 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
20280 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
20290 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
202a0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
202b0 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
202c0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
202d0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
202e0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
202f0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
20300 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
20310 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
20320 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
20330 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
20340 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
20350 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
20360 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
20370 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
20380 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
20390 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
203a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
203b0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
203c0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
203d0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
203e0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
203f0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
20400 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
20410 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
20420 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
20430 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
20440 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
20450 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
20460 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
20470 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
20480 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
20490 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
204a0 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
204b0 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
204c0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
204d0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
204e0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
204f0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
20500 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
20510 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
20520 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
20530 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
20540 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
20550 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
20560 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
20570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
20580 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
20590 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
205a0 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
205b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
205c0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
205d0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
205e0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
205f0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
20600 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
20610 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
20620 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
20630 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
20640 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
20650 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
20660 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
20670 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
20680 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
20690 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
206a0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
206b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
206c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
206d0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
206e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
206f0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
20700 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
20710 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
20720 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
20730 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
20740 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
20750 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
20760 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
20770 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
20780 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
20790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
207a0 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
207b0 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
207c0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
207d0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
207e0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
207f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20800 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
20810 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
20820 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
20830 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
20840 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
20850 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
20860 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
20870 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
20880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20890 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
208a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
208b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
208c0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
208d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
208e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
208f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
20920 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
20930 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
20940 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
20950 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
20960 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
20980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
20990 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
209a0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
209b0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
209c0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
209d0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
209e0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
209f0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
20a00 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
20a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  +){.        rele
20a20 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
20a30 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  e[i]);.        p
20a40 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
20a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20a60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20a70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
20a80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20a90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
20aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20ab0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20ac0 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
20ad0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
20ae0 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
20af0 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
20b00 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
20b10 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
20b20 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
20b30 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
20b40 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
20b50 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
20b60 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
20b70 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
20b80 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
20b90 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
20ba0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
20bb0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
20bc0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
20bd0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
20be0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20bf0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
20c00 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
20c10 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
20c20 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
20c30 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
20c40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
20c50 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
20c60 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
20c70 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
20c80 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
20c90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20ca0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
20cb0 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
20cc0 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
20cd0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
20ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
20cf0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
20d00 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
20d10 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20d20 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
20d30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20d40 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
20d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20d60 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
20d70 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
20d80 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
20d90 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
20da0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20dc0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
20dd0 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
20de0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
20df0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20e00 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
20e10 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
20e20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20e30 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
20e40 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
20e50 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
20e60 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
20e70 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
20e80 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
20e90 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
20ea0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
20eb0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
20ec0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
20ed0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
20ee0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
20ef0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
20f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
20f10 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
20f20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
20f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20f40 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
20f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
20f60 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
20f70 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
20f80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
20f90 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
20fa0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
20fb0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
20fc0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
20fd0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
20fe0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
20ff0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
21000 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
21010 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
21020 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
21030 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
21040 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
21050 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
21060 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
21070 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
21080 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
21090 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
210a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
210b0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
210c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
210d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
210e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
210f0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
21100 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
21110 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
21120 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
21130 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
21140 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
21150 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
21160 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
21170 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
21180 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
21190 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
211a0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
211b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
211c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
211d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
211e0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
211f0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
21200 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
21210 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
21220 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
21230 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
21240 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
21250 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
21260 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
21270 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
21280 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
21290 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
212a0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
212b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
212c0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
212d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
212e0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
212f0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
21300 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
21310 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
21320 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
21330 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
21340 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
21350 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
21360 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
21370 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
21380 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
21390 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
213a0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
213b0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
213c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
213d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
213e0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
213f0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
21400 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
21410 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
21420 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
21430 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
21440 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
21450 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
21460 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
21470 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
21480 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
21490 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
214a0 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
214b0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
214c0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
214d0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
214e0 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
214f0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
21500 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
21510 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
21520 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
21530 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
21540 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
21550 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
21560 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
21570 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
21580 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
21590 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
215a0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
215b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
215c0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
215d0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
215e0 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
215f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
21600 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21610 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
21620 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
21630 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
21640 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21650 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
21660 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
21670 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
21680 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21690 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
216a0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
216b0 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
216c0 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
216d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
216e0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
216f0 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
21700 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
21710 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21720 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
21730 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
21740 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
21750 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
21760 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
21770 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
21780 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
21790 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
217a0 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
217b0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
217c0 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
217d0 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
217e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
217f0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
21800 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
21810 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21820 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
21830 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
21840 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
21850 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21870 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
21880 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21890 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
218a0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
218b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
218c0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
218d0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
218e0 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
218f0 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
21900 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
21910 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
21920 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
21930 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
21940 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
21950 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
21960 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
21970 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
21980 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
21990 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
219a0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
219b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
219c0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
219d0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
219e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
219f0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
21a00 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
21a10 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
21a20 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
21a30 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
21a40 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
21a50 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
21a60 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
21a70 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
21a80 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
21a90 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
21aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21ab0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
21ac0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
21ad0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
21ae0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21af0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
21b00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21b10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21b20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21b30 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
21b40 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
21b50 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
21b60 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
21b70 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
21b80 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
21b90 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
21ba0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
21bb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
21bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21bd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
21be0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21bf0 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
21c00 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
21c10 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
21c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21c30 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
21c40 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
21c50 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
21c60 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
21c70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
21c80 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
21c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
21ca0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
21cb0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
21cc0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
21cd0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
21ce0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
21cf0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21d00 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
21d10 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
21d20 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
21d30 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
21d40 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
21d50 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
21d60 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
21d70 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
21d80 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
21d90 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
21da0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
21db0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
21dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21dd0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
21de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21df0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
21e00 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
21e10 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
21e20 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
21e30 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
21e40 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
21e50 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
21e60 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
21e70 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
21e80 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
21e90 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
21ea0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
21eb0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
21ec0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
21ed0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
21ee0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
21ef0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
21f00 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
21f10 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
21f20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
21f30 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
21f40 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
21f50 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
21f60 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
21f70 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
21f80 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
21f90 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
21fa0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
21fb0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
21fc0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
21fd0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
21fe0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
21ff0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
22000 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
22010 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
22020 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
22030 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
22040 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
22050 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
22060 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
22070 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
22080 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
22090 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
220a0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
220b0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
220c0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
220d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
220e0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
220f0 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
22100 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
22110 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
22120 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
22130 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
22140 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
22150 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
22160 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
22170 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
22180 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
22190 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
221a0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
221b0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
221c0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
221d0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
221e0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
221f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
22200 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
22210 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
22220 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
22230 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
22240 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
22250 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
22260 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
22270 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
22280 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
22290 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
222a0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
222b0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
222c0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
222d0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
222e0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
222f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
22300 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
22310 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
22320 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
22330 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
22340 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
22350 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
22360 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
22370 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
22380 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
22390 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
223a0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
223b0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
223c0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
223d0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
223e0 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
223f0 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
22400 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
22410 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
22420 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
22430 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
22440 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
22450 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
22460 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
22470 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
22480 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
22490 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
224a0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
224b0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
224c0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
224d0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
224e0 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
224f0 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
22500 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
22510 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
22520 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
22530 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
22540 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
22550 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
22560 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
22570 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
22580 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
22590 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
225a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
225b0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
225c0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
225d0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
225e0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
225f0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
22600 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
22610 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
22620 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
22630 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
22640 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22670 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
22680 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
226b0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
226c0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
226d0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226f0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22700 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
22710 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
22720 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
22730 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
22740 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
22750 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
22760 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
22790 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
227a0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
227b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227d0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
227e0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
227f0 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
22820 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
22830 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
22840 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
22850 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
22860 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22870 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
22880 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
22890 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
228a0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
228b0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
228c0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
228d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
228e0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
228f0 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
22900 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
22910 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
22920 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
22930 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
22940 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
22950 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
22960 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
22970 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
22980 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
22990 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
229a0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
229b0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
229c0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
229d0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
229e0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
229f0 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
22a00 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
22a10 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
22a20 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
22a30 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
22a40 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
22a50 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
22a60 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
22a70 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
22a80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
22a90 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
22aa0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
22ab0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
22ac0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22ad0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
22ae0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
22af0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
22b00 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
22b10 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
22b20 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
22b30 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
22b40 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
22b50 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
22b60 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
22b70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
22b80 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
22b90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
22ba0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
22bb0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
22bc0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
22bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
22be0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
22bf0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
22c00 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
22c10 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
22c20 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
22c30 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
22c40 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
22c50 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
22c60 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
22c70 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
22c80 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
22c90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
22ca0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
22cb0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
22cc0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
22cd0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
22ce0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
22cf0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
22d00 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
22d10 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22d20 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
22d30 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
22d40 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
22d50 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
22d60 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
22d70 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
22d80 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
22d90 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
22da0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
22db0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
22dc0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
22dd0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
22de0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
22df0 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
22e00 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
22e10 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22e20 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
22e30 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
22e40 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
22e50 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22e60 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
22e70 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
22e80 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
22e90 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
22ea0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
22eb0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
22ec0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
22ed0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
22ee0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
22ef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
22f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22f10 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
22f20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
22f50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
22f60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
22f90 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
22fa0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
22fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
22fe0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
22ff0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
23000 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23020 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
23030 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
23040 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23070 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
23080 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
23090 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
230a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
230b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
230c0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
230d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
230e0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
230f0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
23100 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
23110 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
23120 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
23130 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
23140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23150 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
23160 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
23170 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
23180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
23190 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
231a0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
231b0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
231c0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
231d0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
231e0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
231f0 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
23200 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
23210 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
23220 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
23230 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
23240 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
23250 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
23260 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
23270 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23280 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
23290 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
232a0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
232b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
232c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
232d0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
232e0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
232f0 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
23300 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
23310 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
23320 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
23330 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
23340 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
23350 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
23360 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
23370 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
23380 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
23390 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
233a0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
233b0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
233c0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
233d0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
233e0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
233f0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
23400 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
23410 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
23420 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
23430 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
23440 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
23450 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
23460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
23470 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
23480 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
23490 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
234a0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
234b0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
234c0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
234d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
234e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
234f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23500 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
23510 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
23520 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
23530 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
23540 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
23550 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
23560 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23570 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
23580 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
23590 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61  sor(pCur);.    a
235a0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
235b0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
235c0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
235d0 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
235e0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
235f0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
23600 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
23610 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
23620 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
23630 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
23640 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
23650 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
23660 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
23670 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
23680 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
236a0 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
236b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
236c0 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
236d0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) );.    }.    f
236e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
236f0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
23700 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
23720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
23730 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
23740 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
23750 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
23760 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
23770 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
23780 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
23790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
237a0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
237b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
237c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
237d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
237e0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
237f0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
23800 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
23810 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
23820 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
23830 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
23840 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
23850 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
23860 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
23870 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
23880 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
23890 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
238a0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
238b0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
238c0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
238d0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
238e0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
238f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
23900 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
23910 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
23920 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23930 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
23940 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
23950 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
23960 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
23970 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
23980 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
23990 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
239a0 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
239b0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
239c0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
239d0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
239e0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
239f0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
23a00 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
23a10 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
23a20 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
23a30 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
23a40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
23a50 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
23a60 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
23a70 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
23a80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
23a90 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
23aa0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
23ab0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23ac0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
23ad0 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
23ae0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
23af0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
23b00 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
23b10 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
23b20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23b30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23b40 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
23b50 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
23b60 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
23b70 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
23b80 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
23b90 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
23ba0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
23bb0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
23bc0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
23bd0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
23be0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
23bf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
23c00 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
23c10 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
23c20 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
23c30 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
23c40 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23c50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23c60 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
23c70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23c80 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
23c90 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
23ca0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
23cb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23cc0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
23cd0 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
23ce0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23cf0 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
23d00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
23d10 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
23d20 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
23d30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23d40 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
23d50 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
23d60 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
23d70 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
23d80 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
23d90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23da0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
23db0 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
23dc0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
23dd0 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
23de0 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
23df0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
23e00 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
23e10 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
23e20 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
23e30 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
23e40 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
23e50 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
23e60 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
23e70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23e80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23e90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23eb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23ec0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23ed0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
23ee0 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
23ef0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
23f00 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
23f10 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
23f20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23f30 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
23f40 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
23f50 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
23f60 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
23f70 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
23f80 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
23f90 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
23fa0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
23fb0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
23fc0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
23fd0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
23fe0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
23ff0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
24000 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
24010 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24020 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
24030 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
24040 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
24050 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
24060 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
24070 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
24080 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
24090 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
240a0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
240b0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
240c0 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
240d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
240e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
240f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24100 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24110 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24120 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
24130 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24140 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24150 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
24160 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
24170 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
24180 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24190 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
241a0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
241b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
241c0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
241d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
241e0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
241f0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
24200 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24210 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
24220 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
24230 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
24240 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
24250 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
24260 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
24270 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
24280 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24290 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
242a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
242b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
242c0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
242d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
242e0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
242f0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
24300 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
24310 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
24320 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
24330 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
24340 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
24350 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
24360 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
24370 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
24380 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
24390 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
243a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
243b0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
243c0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
243d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
243e0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
243f0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
24400 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
24410 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
24420 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
24430 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
24440 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
24450 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
24460 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
24470 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
24480 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
24490 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
244a0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
244b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
244c0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
244d0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
244e0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
244f0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
24500 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
24510 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
24520 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
24530 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
24540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24560 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
24590 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
245a0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
245b0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
245c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
245d0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
245e0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
245f0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
24600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24610 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
24620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
24630 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
24640 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
24650 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
24660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24680 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24690 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
246a0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
246b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
246c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
246d0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
246e0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
246f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
24700 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
24710 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
24720 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
24730 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
24740 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
24750 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
24760 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
24770 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
24780 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
24790 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
247a0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
247b0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
247c0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
247d0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
247e0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
247f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
24800 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
24810 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24820 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
24830 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
24840 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
24850 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
24860 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
24870 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
24880 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
24890 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
248a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
248b0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
248c0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
248d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
248e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
248f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
24900 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
24910 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
24920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24930 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
24940 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
24950 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
24960 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
24970 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
24980 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
24990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
249a0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
249b0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
249c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
249d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
249e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
249f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24a00 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
24a10 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
24a20 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
24a30 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
24a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
24a50 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
24a60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
24a80 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
24a90 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24aa0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24ab0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24ac0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24ad0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24af0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
24b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24b10 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24b20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
24b30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
24b40 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
24b50 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
24b60 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
24b70 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
24b80 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
24b90 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24ba0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24bb0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24bc0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24bd0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24be0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24bf0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24c00 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24c10 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24c20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24c30 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
24c40 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
24c50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
24c60 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
24c70 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
24c80 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
24c90 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24ca0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24cb0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24cc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24cd0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24ce0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24cf0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24d00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24d10 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24d20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24d30 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24d40 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
24d50 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
24d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24d70 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
24d80 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24db0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24dc0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24de0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24df0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24e00 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24e10 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24e20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24e30 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
24e40 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
24e50 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24e60 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
24e70 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
24e80 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24e90 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24ea0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24eb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24ee0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24ef0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24f00 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24f10 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24f20 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24f30 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
24f40 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24f50 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
24f60 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
24f70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24f80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24f90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24fa0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24fb0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
24fc0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
24fd0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
24fe0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
24ff0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25000 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
25010 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
25020 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
25030 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
25040 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
25050 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
25060 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25070 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
25080 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25090 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
250a0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
250b0 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
250c0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
250d0 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
250e0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
250f0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
25100 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
25110 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
25120 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
25130 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
25140 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
25150 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
25160 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
25170 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25180 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25190 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
251a0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
251b0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
251c0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
251d0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
251e0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
251f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
25200 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
25210 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
25220 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
25230 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
25240 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
25250 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
25260 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
25270 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
25280 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
25290 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
252a0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
252b0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
252c0 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
252d0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
252e0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
252f0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
25300 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
25310 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
25320 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
25330 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
25340 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
25350 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
25360 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
25370 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25380 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25390 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
253a0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
253b0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
253c0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
253d0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
253e0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
253f0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25400 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25410 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
25420 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25430 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
25440 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
25450 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
25460 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
25470 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25480 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25490 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
254a0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
254b0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
254c0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
254d0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
254e0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
254f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25500 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25510 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25520 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
25530 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
25540 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
25550 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
25560 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
25570 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25580 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25590 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
255a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
255b0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
255c0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
255d0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
255e0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
255f0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
25600 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
25610 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
25620 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
25630 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
25640 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25650 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
25660 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25670 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25680 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25690 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
256a0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
256b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
256c0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
256e0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
256f0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
25700 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
25710 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
25720 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25730 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
25740 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
25750 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25780 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
25790 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
257a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
257b0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
257c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
257d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
257e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
257f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25800 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
25810 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
25820 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25830 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25840 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
25850 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
25860 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
25870 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
25880 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
25890 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
258a0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
258b0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
258c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
258d0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
258e0 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
258f0 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
25900 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
25910 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
25920 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
25930 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
25940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
25950 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
25960 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
25970 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
25980 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
25990 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
259a0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
259b0 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
259c0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
259d0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
259e0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
259f0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
25a00 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
25a10 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
25a20 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
25a30 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
25a40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
25a50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
25a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
25a70 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
25a80 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
25a90 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
25aa0 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
25ab0 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
25ac0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
25ad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25ae0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
25af0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
25b00 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
25b10 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
25b20 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
25b30 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
25b40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25b50 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
25b60 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
25b70 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
25b80 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
25b90 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
25ba0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
25bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25bc0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
25bd0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
25be0 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
25bf0 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
25c00 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
25c10 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
25c20 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
25c30 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
25c40 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
25c50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
25c60 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
25c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
25c80 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
25c90 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
25ca0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
25cb0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
25cc0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
25cd0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
25ce0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
25cf0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
25d00 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
25d10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
25d20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
25d30 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
25d40 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
25d50 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
25d60 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
25d70 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
25d80 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
25d90 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
25da0 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
25db0 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
25dc0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
25dd0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
25de0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
25df0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
25e00 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
25e10 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
25e20 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
25e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25e40 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
25e50 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
25e60 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
25e70 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
25e80 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
25e90 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
25ea0 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
25eb0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
25ec0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
25ed0 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
25ee0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
25ef0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
25f00 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
25f10 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
25f20 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
25f30 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
25f40 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
25f50 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
25f60 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
25f70 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
25f80 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
25f90 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
25fa0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
25fb0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
25fc0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
25fd0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
25fe0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
25ff0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
26000 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26010 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
26020 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26030 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
26040 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
26050 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
26060 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
26070 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
26080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
260a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
260b0 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
260c0 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
260d0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
260e0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
260f0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26100 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
26110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26120 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26130 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
26140 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
26150 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
26160 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
26170 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
26180 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26190 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
261a0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
261b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
261c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
261d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
261e0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
261f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
26200 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
26210 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
26220 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
26230 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
26240 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
26250 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
26260 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
26270 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
26280 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
26290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
262a0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
262b0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
262c0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
262d0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
262e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
262f0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
26300 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26310 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26320 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
26330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26340 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26350 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
26360 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
26370 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
26380 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
26390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
263a0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
263b0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
263c0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
263d0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
263e0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
263f0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
26400 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
26410 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
26420 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
26430 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
26440 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
26450 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
26460 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
26470 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26480 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
26490 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
264a0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
264b0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
264c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
264d0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
264e0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
264f0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
26500 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
26510 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
26520 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
26530 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26540 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
26550 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26560 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26570 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
26580 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
26590 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
265a0 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
265b0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
265c0 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
265d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
265e0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
265f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26600 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
26610 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26620 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
26630 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
26640 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
26650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
26660 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26670 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
26680 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26690 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
266a0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
266b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
266c0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
266d0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
266e0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
266f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26700 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
26710 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26730 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
26740 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26750 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26760 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26770 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26780 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26790 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
267a0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
267b0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
267c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
267d0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
267e0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
267f0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
26800 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
26810 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
26820 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
26830 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
26840 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
26850 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
26860 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
26870 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26880 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26890 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
268a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
268b0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
268c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
268d0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
268e0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
268f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
26900 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
26910 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
26920 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
26930 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
26940 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
26950 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
26960 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
26970 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
26980 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
26990 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
269a0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
269b0 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
269c0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
269d0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
269e0 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
269f0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
26a00 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
26a10 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
26a20 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
26a30 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
26a40 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
26a50 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
26a60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26a70 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
26a80 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
26a90 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
26aa0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
26ab0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
26ac0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
26ad0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
26ae0 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
26af0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
26b00 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
26b10 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
26b20 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
26b30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26b50 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26b60 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
26b90 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26ba0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
26be0 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
26bf0 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26c30 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26c40 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26c50 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26c60 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26c70 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
26c80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
26c90 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
26ca0 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
26cb0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
26cc0 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50    && 0==sqlite3P
26cd0 61 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e  agerUseWal(pBt->
26ce0 70 50 61 67 65 72 29 20 20 20 20 20 20 20 20 20  pPager)         
26cf0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
26d00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
26d10 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26d20 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26d50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26d60 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26d70 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
26d80 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
26d90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26da0 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
26db0 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26dd0 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
26de0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26df0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
26e00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26e10 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26e20 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26e30 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26e40 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26e50 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26e60 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26e70 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
26e80 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
26e90 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
26ea0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26eb0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
26ec0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
26ed0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
26ee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26ef0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
26f00 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
26f10 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
26f20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
26f30 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
26f40 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
26f50 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
26f60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26f80 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
26f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26fa0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
26fc0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26fd0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
26fe0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
26ff0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27000 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
27010 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
27020 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
27030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
27040 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
27050 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27060 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
27070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27080 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
27090 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
270a0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
270b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
270c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
270d0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
270e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
270f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
27100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27110 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27120 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
27130 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
27140 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
27150 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
27160 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
27170 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
27180 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27190 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
271a0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
271b0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
271c0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
271d0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
271e0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
271f0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27200 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
27210 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27220 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27230 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
27240 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
27250 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27260 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
27270 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
27280 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27290 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
272a0 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
272b0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
272c0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
272d0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
272e0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
272f0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27300 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27310 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
27320 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
27330 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
27340 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
27350 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
27360 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
27370 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
27380 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
27390 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
273a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
273b0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
273c0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
273d0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
273e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
273f0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
27400 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27410 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27420 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
27430 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
27440 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
27450 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
27460 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27470 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27480 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27490 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
274a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
274b0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
274c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274d0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
274e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
274f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27520 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
27530 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
27540 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
27550 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
27560 66 2c 20 30 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  f, 0);.}.#ifndef
27570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
27580 52 42 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74 65  RBLOB.int sqlite
27590 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
275a0 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
275b0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
275c0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
275d0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
275e0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
275f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27600 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
27610 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
27620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
27630 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
27640 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
27650 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
27660 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27680 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
27690 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
276a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
276b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
276c0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
276d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
276e0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
276f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27700 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27720 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27730 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
27740 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
27750 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
27760 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
27770 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
27780 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
27790 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
277a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
277b0 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
277c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
277d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
277e0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
277f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
27800 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
27810 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
27820 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
27830 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65  ey if index btre
27840 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
27850 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65  y==0) and is the
27860 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62   data for.** tab
27870 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65  le btrees (pPage
27880 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68  ->intKey==1). Th
27890 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
278a0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a  s of available.*
278b0 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  * key/data is wr
278c0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74  itten into *pAmt
278d0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
278e0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  then the value.*
278f0 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  * returned will 
27900 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70  not be a valid p
27910 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
27920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
27930 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
27940 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
27950 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
27960 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
27970 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
27980 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
27990 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
279a0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
279b0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
279c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
279d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
279e0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
279f0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
27a00 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
27a10 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
27a20 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
27a30 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
27a40 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
27a50 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
27a60 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
27a70 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
27a80 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
27a90 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
27aa0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
27ab0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
27ac0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
27ad0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
27ae0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
27af0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
27b00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
27b10 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
27b20 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
27b30 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
27b40 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
27b50 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
27b60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f  .static const vo
27b70 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  id *fetchPayload
27b80 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
27b90 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
27ba0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
27bb0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
27bc0 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74  m */.  u32 *pAmt
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
27be0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
27bf0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
27c00 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  es here */.){.  
27c10 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72  u32 amt;.  asser
27c20 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
27c30 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
27c40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27c50 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
27c60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27c70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27c90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27ca0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
27cb0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
27cc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27cd0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27d00 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
27d10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27d20 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
27d30 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
27d40 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Size>0 );.  asse
27d50 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
27d60 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70  Payload>pCur->ap
27d70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27d80 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  ]->aData || CORR
27d90 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
27da0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
27db0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70  Payload<pCur->ap
27dc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27dd0 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  ]->aDataEnd ||CO
27de0 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
27df0 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61   = (int)(pCur->a
27e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27e10 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  e]->aDataEnd - p
27e20 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27e30 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ad);.  if( pCur-
27e40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74  >info.nLocal<amt
27e50 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69   ) amt = pCur->i
27e60 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70  nfo.nLocal;.  *p
27e70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74  Amt = amt;.  ret
27e80 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
27e90 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
27ea0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
27eb0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
27ec0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
27ed0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
27ee0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
27ef0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
27f00 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
27f10 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
27f20 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
27f30 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
27f40 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
27f50 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
27f60 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
27f70 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
27f80 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
27f90 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
27fa0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
27fb0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
27fc0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
27fd0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
27fe0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
27ff0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
28000 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
28010 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
28020 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
28030 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
28040 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
28050 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
28060 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
28070 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
28080 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
28090 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
280a0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
280b0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
280c0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
280d0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
280e0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
280f0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  d *sqlite3BtreeP
28100 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75  ayloadFetch(BtCu
28110 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28120 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
28130 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
28140 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
28150 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28160 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
28170 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
28180 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
28190 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
281a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
281b0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
281c0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
281d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
281e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
281f0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
28200 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
28210 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
28220 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
28230 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
28240 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
28250 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
28260 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
28270 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
28280 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
28290 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
282a0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
282b0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
282c0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
282d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
282e0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
282f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28300 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
28310 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28320 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28340 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28350 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
28360 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
28370 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
28380 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
28390 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
283a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
283b0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
283c0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
283d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
283e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
283f0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
28400 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28410 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28420 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28430 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28440 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
28450 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
28460 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30  pCur->iPage] = 0
28470 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
28480 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
28490 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61  ewPgno, &pCur->a
284a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
284b0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
284c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
284d0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
284e0 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53  Flags);.}..#if S
284f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
28500 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
28510 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
28520 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
28530 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
28540 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
28550 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
28560 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
28570 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
28580 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
28590 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
285a0 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
285b0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
285c0 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
285d0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
285e0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
285f0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
28600 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
28610 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
28620 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
28630 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
28640 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
28650 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
28660 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
28670 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
28680 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
28690 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
286a0 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
286b0 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
286e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
286f0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
28700 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
28710 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
28720 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
28730 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28740 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
28750 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
28760 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
28770 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28780 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28790 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
287a0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
287b0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
287c0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
287d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
287e0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
287f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28800 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
28810 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
28820 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
28830 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
28840 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
28850 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
28860 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
28870 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
28880 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
28890 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
288a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
288b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
288c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
288d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
288e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
288f0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
28900 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
28910 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28920 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
28930 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
28940 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28950 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28960 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28970 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28980 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
28990 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
289a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
289b0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
289c0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
289d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
289e0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
289f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28a00 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28a10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28a20 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
28a30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
28a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28a50 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
28a60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28a70 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
28a80 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
28a90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28aa0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28ab0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28ac0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28ad0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
28ae0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
28af0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
28b00 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
28b10 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
28b20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
28b30 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
28b40 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
28b50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
28b60 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
28b70 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
28b80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
28b90 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
28ba0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
28bb0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
28bc0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
28bd0 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
28be0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
28bf0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
28c00 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
28c10 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
28c20 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
28c30 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
28c40 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
28c50 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
28c60 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
28c70 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
28c80 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
28c90 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
28ca0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
28cb0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
28cc0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
28cd0 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
28ce0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
28cf0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28d00 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
28d10 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
28d20 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
28d30 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
28d40 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
28d50 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
28d60 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
28d70 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
28d80 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
28d90 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
28da0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28db0 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
28dc0 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
28dd0 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
28de0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
28df0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
28e00 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
28e10 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
28e20 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
28e30 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
28e40 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
28e50 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
28e60 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28e70 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
28e80 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
28e90 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
28ea0 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
28eb0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
28ec0 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
28ed0 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
28ee0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28ef0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
28f00 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
28f10 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
28f20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
28f30 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
28f40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28f50 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
28f60 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
28f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
28f80 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28f90 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28fb0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
28fc0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28fe0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
28ff0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29010 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
29020 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29030 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
29040 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
29050 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
29060 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29070 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
29080 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
29090 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
290a0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
290b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
290c0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
290d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
290e0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
290f0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
29100 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29110 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
29120 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
29130 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  do{.        asse
29140 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
29150 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
29160 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
29170 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
29180 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29190 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
291a0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
291b0 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  >iPage);.      g
291c0 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20  oto skip_init;. 
291d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
291e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
291f0 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
29200 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29210 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
29220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29240 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
29250 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20  =(-1) );.    rc 
29260 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
29270 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
29280 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
29290 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
292a0 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
292c0 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
292d0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
292e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
292f0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29300 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29310 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74 75  LID;.       retu
29320 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29330 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
29340 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
29350 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
29360 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
29370 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
29380 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
29390 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
293a0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
293b0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
293c0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
293d0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
293e0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
293f0 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
29400 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
29410 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
29420 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
29430 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29440 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
29450 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
29460 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
29470 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
29480 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
29490 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
294a0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
294b0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
294c0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
294d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
294e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
294f0 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
29500 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
29510 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
29520 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
29530 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29540 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
29550 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
29560 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
29570 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
29580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
29590 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
295a0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
295b0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
295c0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
295d0 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
295e0 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
295f0 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
29600 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29610 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
29620 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
29630 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
29640 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
29650 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
29660 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
29670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29680 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29690 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  T;.  }..skip_ini
296a0 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 61 69 49  t:  .  pCur->aiI
296b0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
296c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
296d0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
296e0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
296f0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
29700 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29710 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
29720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
29730 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
29740 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
29750 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29760 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
29770 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
29780 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
29790 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
297a0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
297b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
297c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
297d0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
297e0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
297f0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
29800 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29810 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29820 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
29830 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29840 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
29850 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
29860 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29870 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
29880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29890 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
298a0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
298b0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
298c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
298d0 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
298e0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
298f0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
29900 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
29910 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
29920 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
29930 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
29940 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
29950 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29960 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
29970 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
29980 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29990 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
299a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
299b0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
299c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
299d0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
299e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
299f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29a00 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
29a10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29a20 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
29a30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29a40 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
29a50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29a60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29a70 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
29a80 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
29a90 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
29aa0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29ab0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29ac0 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
29ad0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29ae0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
29af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29b00 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
29b10 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
29b20 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
29b30 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29b40 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
29b50 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
29b60 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
29b70 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
29b80 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
29b90 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
29ba0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
29bb0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
29bc0 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
29bd0 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
29be0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29bf0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
29c00 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
29c10 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29c20 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
29c30 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
29c40 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
29c50 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
29c60 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
29c70 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
29c80 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
29c90 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
29ca0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29cb0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
29cc0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
29cd0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
29ce0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
29cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
29d00 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29d10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29d20 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29d30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29d40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29d50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29d60 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
29d70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29d80 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29d90 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
29da0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29db0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29dc0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
29dd0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29de0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29df0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
29e00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29e10 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
29e20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29e30 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
29e40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29e50 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29e60 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
29e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29e80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29e90 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29ea0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29eb0 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
29ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29ed0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29ee0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
29ef0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29f00 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29f10 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29f20 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29f30 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29f40 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29f50 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29f60 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
29f70 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
29f80 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29f90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
29fa0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
29fb0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29fc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
29fd0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29fe0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a010 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a020 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2a030 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a040 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a060 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2a070 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2a080 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a090 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a0a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a0b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a0c0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a0d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a0f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2a100 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a110 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2a120 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a130 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2a140 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2a150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2a170 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2a180 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2a190 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2a1a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2a1b0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2a1c0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2a1d0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2a1e0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2a1f0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2a200 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2a210 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2a220 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2a230 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2a240 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2a250 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2a260 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2a270 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a280 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a290 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a2a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a2b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a2c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2a2d0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2a2e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2a2f0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2a300 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2a310 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2a320 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2a330 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a340 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a350 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2a360 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2a370 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2a380 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2a390 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2a3a0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2a3b0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2a3c0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a3d0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2a3e0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2a3f0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2a400 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2a410 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a420 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2a430 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2a440 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2a450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a460 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a470 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
2a480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a490 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2a4a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2a4b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a4c0 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2a4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a4e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2a4f0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a500 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a520 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2a530 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a540 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a550 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a560 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a570 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a580 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a590 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a5b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a5c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a5d0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2a5e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2a5f0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a600 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2a610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a620 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a630 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2a640 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a660 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a670 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2a680 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2a690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a6a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2a6b0 74 68 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  the cursor pCur 
2a6c0 74 6f 20 61 20 6c 6f 63 61 74 69 6f 6e 20 77 69  to a location wi
2a6d0 74 68 69 6e 20 69 74 73 20 62 2d 74 72 65 65 20  thin its b-tree 
2a6e0 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f  that is.** appro
2a6f0 78 69 6d 61 74 65 6c 79 20 74 68 65 20 78 2f 31  ximately the x/1
2a700 65 39 2a 6e 52 6f 77 20 65 6e 74 72 79 20 69 6e  e9*nRow entry in
2a710 20 74 68 65 20 74 61 62 6c 65 2c 20 61 73 73 75   the table, assu
2a720 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 74 61 62 6c  ming the.** tabl
2a730 65 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  e contains nRow 
2a740 65 6e 74 72 69 65 73 2e 20 20 53 6f 2c 20 69 6e  entries.  So, in
2a750 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
2a760 20 78 3d 3d 30 20 6d 6f 76 65 0a 2a 2a 20 74 6f   x==0 move.** to
2a770 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2a780 20 61 6e 64 20 69 66 20 78 3d 31 65 39 20 6d 6f   and if x=1e9 mo
2a790 76 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ve to the last e
2a7a0 6e 74 72 79 20 61 6e 64 20 69 66 0a 2a 2a 20 78  ntry and if.** x
2a7b0 3d 35 65 38 20 6d 6f 76 65 20 74 6f 20 74 68 65  =5e8 move to the
2a7c0 20 6d 69 64 64 6c 65 20 65 6e 74 72 79 2e 20 20   middle entry.  
2a7d0 54 68 65 20 66 69 6e 61 6c 20 6c 61 6e 64 69 6e  The final landin
2a7e0 67 20 73 70 6f 74 20 69 73 0a 2a 2a 20 61 70 70  g spot is.** app
2a7f0 72 6f 78 69 6d 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  roximate..**.** 
2a800 57 72 69 74 65 20 61 6e 20 65 73 74 69 6d 61 74  Write an estimat
2a810 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
2a820 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
2a830 65 20 62 2d 74 72 65 65 20 69 6e 74 6f 0a 2a 2a  e b-tree into.**
2a840 20 74 68 65 20 2a 70 6e 52 6f 77 45 73 74 20 76   the *pnRowEst v
2a850 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  ariable..**.** T
2a860 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
2a870 73 20 62 79 20 66 69 72 73 74 20 6d 6f 76 69 6e  s by first movin
2a880 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
2a890 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 0a  the root of the.
2a8a0 2a 2a 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ** b-tree, then 
2a8b0 66 6f 6c 6c 6f 77 69 6e 67 20 70 6f 69 6e 74 65  following pointe
2a8c0 72 73 20 64 6f 77 6e 20 74 6f 20 61 20 6c 65 61  rs down to a lea
2a8d0 66 2c 20 73 65 6c 65 63 74 69 6e 67 20 61 20 70  f, selecting a p
2a8e0 6f 69 6e 74 65 72 0a 2a 2a 20 61 63 63 6f 72 64  ointer.** accord
2a8f0 69 6e 67 20 74 6f 20 78 2e 0a 2a 2a 0a 2a 2a 20  ing to x..**.** 
2a900 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
2a910 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2a920 69 73 20 66 6f 75 6e 64 20 62 79 20 6d 75 6c 74  is found by mult
2a930 69 70 6c 79 69 6e 67 20 74 68 65 20 6e 75 6d 62  iplying the numb
2a940 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73  er of.** entries
2a950 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67   on the leaf pag
2a960 65 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  e by the number 
2a970 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 74 20 65  of pointers at e
2a980 61 63 68 20 6c 61 79 65 72 20 6f 66 0a 2a 2a 20  ach layer of.** 
2a990 6e 6f 6e 2d 6c 65 61 66 20 70 61 67 65 73 2e 0a  non-leaf pages..
2a9a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2a9b0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
2a9c0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
2a9d0 64 65 20 69 66 20 70 72 6f 62 6c 65 6d 73 20 61  de if problems a
2a9e0 72 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  re encountered..
2a9f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2aa00 72 65 65 4d 6f 76 65 74 6f 50 72 6f 70 6f 72 74  reeMovetoProport
2aa10 69 6f 6e 61 6c 28 0a 20 20 42 74 43 75 72 73 6f  ional(.  BtCurso
2aa20 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2aa30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
2aa40 20 72 65 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20   reposition */. 
2aa50 20 75 33 32 20 78 2c 20 20 20 20 20 20 20 20 20   u32 x,         
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2aa70 70 70 72 6f 78 69 6d 61 74 65 20 6c 6f 63 61 74  pproximate locat
2aa80 69 6f 6e 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  ion to position 
2aa90 74 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  the cursor */.  
2aaa0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 2a  sqlite3_uint64 *
2aab0 70 6e 52 6f 77 45 73 74 20 20 20 2f 2a 20 57 72  pnRowEst   /* Wr
2aac0 69 74 65 20 65 73 74 69 6d 61 74 65 64 20 65 6e  ite estimated en
2aad0 74 72 79 20 63 6f 75 6e 74 20 68 65 72 65 20 2a  try count here *
2aae0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75  /.){.  sqlite3_u
2aaf0 69 6e 74 36 34 20 6e 20 3d 20 31 3b 0a 20 20 69  int64 n = 1;.  i
2ab00 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 63 68  nt rc;.  Pgno ch
2ab10 6c 64 50 67 3b 0a 20 20 75 33 32 20 6d 78 20 3d  ldPg;.  u32 mx =
2ab20 20 31 30 30 30 30 30 30 30 30 30 3b 0a 20 20 75   1000000000;.  u
2ab30 33 32 20 70 65 72 43 68 69 6c 64 3b 0a 20 20 75  32 perChild;.  u
2ab40 31 36 20 72 78 3b 0a 20 20 4d 65 6d 50 61 67 65  16 rx;.  MemPage
2ab50 20 2a 70 50 61 67 65 3b 0a 20 20 72 63 20 3d 20   *pPage;.  rc = 
2ab60 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2ab70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2ab80 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
2ab90 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2aba0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 21 70 50 61  ];.  while( !pPa
2abb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2abc0 70 65 72 43 68 69 6c 64 20 3d 20 28 6d 78 2b 70  perChild = (mx+p
2abd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 2f 28 70 50  Page->nCell)/(pP
2abe0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 31 29 3b 0a 20  age->nCell+1);. 
2abf0 20 20 20 69 66 28 20 70 65 72 43 68 69 6c 64 3c     if( perChild<
2ac00 31 20 29 20 70 65 72 43 68 69 6c 64 20 3d 20 31  1 ) perChild = 1
2ac10 3b 0a 20 20 20 20 72 78 20 3d 20 78 2f 70 65 72  ;.    rx = x/per
2ac20 43 68 69 6c 64 3b 0a 20 20 20 20 78 20 25 3d 20  Child;.    x %= 
2ac30 70 65 72 43 68 69 6c 64 3b 0a 20 20 20 20 6d 78  perChild;.    mx
2ac40 20 3d 20 70 65 72 43 68 69 6c 64 3b 0a 20 20 20   = perChild;.   
2ac50 20 69 66 28 20 72 78 3e 3d 70 50 61 67 65 2d 3e   if( rx>=pPage->
2ac60 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2ac70 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2ac80 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ac90 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2aca0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2acb0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2acc0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2acd0 28 70 50 61 67 65 2c 72 78 29 29 3b 0a 20 20 20  (pPage,rx));.   
2ace0 20 7d 0a 20 20 20 20 6e 20 2a 3d 20 70 50 61 67   }.    n *= pPag
2acf0 65 2d 3e 6e 43 65 6c 6c 2b 31 3b 0a 20 20 20 20  e->nCell+1;.    
2ad00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ad10 2d 3e 69 50 61 67 65 5d 20 3d 20 72 78 3b 0a 20  ->iPage] = rx;. 
2ad20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2ad30 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2ad40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2ad50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
2ad60 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ad70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ad80 3b 0a 20 20 7d 0a 20 20 2a 70 6e 52 6f 77 45 73  ;.  }.  *pnRowEs
2ad90 74 20 3d 20 6e 2a 70 50 61 67 65 2d 3e 6e 43 65  t = n*pPage->nCe
2ada0 6c 6c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ll;.  if( pPage-
2adb0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
2adc0 20 72 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   rx = 0;.  }else
2add0 7b 0a 20 20 20 20 70 65 72 43 68 69 6c 64 20 3d  {.    perChild =
2ade0 20 6d 78 2f 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   mx/pPage->nCell
2adf0 3b 0a 20 20 20 20 69 66 28 20 70 65 72 43 68 69  ;.    if( perChi
2ae00 6c 64 3c 31 20 29 20 70 65 72 43 68 69 6c 64 20  ld<1 ) perChild 
2ae10 3d 20 31 3b 0a 20 20 20 20 72 78 20 3d 20 78 2f  = 1;.    rx = x/
2ae20 70 65 72 43 68 69 6c 64 3b 0a 20 20 20 20 69 66  perChild;.    if
2ae30 28 20 72 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ( rx>=pPage->nCe
2ae40 6c 6c 20 29 20 72 78 20 3d 20 70 50 61 67 65 2d  ll ) rx = pPage-
2ae50 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 7d 0a 20 20  >nCell-1;.  }.  
2ae60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ae70 2d 3e 69 50 61 67 65 5d 20 3d 20 72 78 3b 0a 0a  ->iPage] = rx;..
2ae80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae90 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
2aea0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2aeb0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2aec0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2aed0 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2aee0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2aef0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2af00 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2af10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2af20 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2af30 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2af40 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2af50 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2af60 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2af70 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2af80 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2af90 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2afa0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2afb0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2afc0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2afd0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2afe0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2aff0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2b000 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2b010 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2b020 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2b030 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2b040 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2b050 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2b060 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2b070 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2b080 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2b090 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2b0a0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2b0b0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2b0c0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2b0d0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2b0e0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2b0f0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2b100 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2b110 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2b120 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2b130 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2b140 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2b150 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2b160 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2b170 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2b180 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2b1a0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2b1b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2b1c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2b1d0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2b1e0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2b1f0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2b200 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2b210 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2b220 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2b230 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2b240 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2b250 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2b260 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2b270 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2b280 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2b290 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2b2a0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2b2b0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2b2c0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2b2d0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2b2f0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2b300 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2b310 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2b320 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2b330 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2b340 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2b350 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2b360 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2b370 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2b380 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2b390 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2b3a0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2b3b0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2b3c0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2b3d0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2b3e0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2b3f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2b400 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2b410 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2b420 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2b430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b440 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2b450 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2b460 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2b470 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2b480 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2b490 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2b4a0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2b4b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2b4c0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2b4d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2b4e0 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2b4f0 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2b500 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b510 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b520 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b540 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2b550 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2b560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2b570 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2b580 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2b590 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2b5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b5b0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b5c0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2b5d0 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2b5e0 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2b5f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2b600 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2b610 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2b620 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2b630 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2b640 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2b650 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2b660 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2b670 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2b680 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2b690 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b6a0 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2b6b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2b6c0 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2b6d0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2b6e0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2b6f0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2b700 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2b710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b720 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (pCu
2b730 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2b740 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
2b750 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2b760 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2b770 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b790 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
2b7a0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2b7b0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2b7c0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2b7d0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2b7e0 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2b7f0 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2b800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2b810 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2b820 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2b830 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2b840 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2b850 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2b860 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2b870 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2b880 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2b890 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2b8a0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2b8b0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2b8c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2b8d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2b8e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2b8f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2b900 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2b910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b920 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2b930 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2b940 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2b950 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b960 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
2b970 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2b980 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2b990 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
2b9a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b9b0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
2b9c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b9d0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2b9e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
2b9f0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2ba00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2ba10 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2ba20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2ba30 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2ba40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ba50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ba60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2ba70 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63  >intKey==pCur->c
2ba80 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73  urIntKey );.  as
2ba90 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
2baa0 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
2bab0 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
2bac0 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
2bad0 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
2bae0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
2baf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2bb00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bb10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
2bb20 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2bb50 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2bb60 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2bb70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2bb80 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2bb90 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2bba0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2bbb0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2bbc0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2bbd0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2bbe0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2bbf0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2bc00 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2bc10 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2bc20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2bc30 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2bc40 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2bc50 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2bc60 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2bc70 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2bc80 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2bc90 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2bca0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2bcb0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2bcc0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2bcd0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2bce0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2bcf0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2bd00 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2bd10 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2bd20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bd30 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2bd40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2bd50 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2bd60 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2bd70 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2bd80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2bd90 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2bda0 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2bdb0 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2bdc0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2bdd0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2bde0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2bdf0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2be00 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2be10 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2be20 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2be30 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2be40 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2be50 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2be60 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2be70 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2be80 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2be90 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2bea0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2beb0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2bec0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2bed0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2bee0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2bef0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2bf00 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
2bf10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bf20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2bf30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bf40 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2bf50 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2bf60 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2bf70 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2bf80 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2bf90 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2bfa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bfb0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2bfc0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2bfd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2bfe0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2bff0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c000 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c010 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2c020 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2c030 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2c040 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c050 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2c060 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2c070 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c080 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2c090 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2c0a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c0c0 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2c0d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c0e0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2c0f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c100 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2c110 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2c120 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2c130 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c140 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2c150 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2c160 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2c170 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2c180 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2c190 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2c1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c1c0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2c1d0 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2c1e0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2c1f0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2c200 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c210 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2c220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c230 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2c240 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2c250 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2c260 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2c270 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2c280 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2c290 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2c2a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2c2b0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2c2c0 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2c2d0 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2c2e0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2c2f0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2c300 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2c310 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2c320 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2c330 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2c340 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2c350 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2c360 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2c370 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2c380 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2c390 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2c3a0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2c3b0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2c3c0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2c3d0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2c3e0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2c3f0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2c400 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2c410 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2c420 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2c430 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2c440 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2c450 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2c460 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2c470 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2c480 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2c490 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2c4a0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2c4b0 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2c4c0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2c4d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2c4e0 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2c4f0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2c500 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2c510 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2c520 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2c530 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2c540 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2c550 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2c560 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2c570 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2c580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2c590 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2c5a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2c5b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c5c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c5d0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2c5e0 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2c5f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c600 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2c610 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2c620 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2c630 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2c640 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2c650 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2c660 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c670 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2c680 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2c690 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2c6a0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2c6b0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2c6c0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2c6d0 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2c6e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c6f0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2c700 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2c710 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2c720 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2c730 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2c740 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2c750 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2c760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c770 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2c780 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2c790 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2c7a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2c7b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2c7c0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2c7d0 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2c7e0 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2c7f0 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2c800 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2c810 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2c820 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2c830 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2c840 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2c850 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2c860 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2c870 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2c880 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2c890 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2c8a0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2c8b0 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2c8c0 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2c8d0 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2c8e0 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2c8f0 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2c900 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2c910 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2c920 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2c930 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2c940 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2c950 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2c960 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2c970 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2c980 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2c990 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2c9a0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2c9b0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2c9c0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2c9d0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2c9e0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2c9f0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2ca00 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2ca10 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2ca20 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2ca30 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2ca40 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2ca50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2ca60 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2ca70 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2ca80 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2ca90 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2caa0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2cab0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2cac0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2cad0 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2cae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2caf0 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2cb00 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2cb10 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2cb20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2cb30 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2cb40 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2cb50 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2cb60 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2cb70 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2cb90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cba0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2cbb0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2cbc0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2cbd0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2cbe0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2cbf0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2cc00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cc10 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2cc20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2cc30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2cc40 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2cc50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2cc60 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2cc70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2cc80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2cc90 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2cca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2ccb0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2ccc0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2ccd0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2cce0 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  Key, 2);.       
2ccf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2cd00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cd10 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2cd30 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2cd40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cd50 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2cd60 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2cd70 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2cd80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2cd90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2cda0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2cdb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cdc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2cdd0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2cde0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2cdf0 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2ce00 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2ce10 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2ce20 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2ce30 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2ce40 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2ce50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2ce60 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2ce70 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2ce80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2ce90 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2cea0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2ceb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2ced0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2cee0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2cef0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cf00 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2cf10 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2cf20 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2cf30 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2cf40 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2cf50 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2cf60 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2cf70 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2cf80 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2cf90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2cfa0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2cfb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2cfc0 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2cfd0 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2cfe0 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2cff0 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2d000 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2d010 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2d020 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2d030 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2d040 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2d050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d060 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2d070 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2d080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d090 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d0a0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
2d0b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2d0c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2d0d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2d0e0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2d0f0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2d100 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2d110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d120 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d130 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2d140 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2d150 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2d160 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d170 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2d180 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2d190 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d1a0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2d1b0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2d1c0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2d1d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2d1e0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2d1f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d200 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
2d210 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2d220 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2d230 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2d240 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2d250 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2d260 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d270 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2d280 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d290 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2d2a0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2d2b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2d2c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2d2d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2d2e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2d2f0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2d300 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2d310 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2d320 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2d330 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2d340 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2d350 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2d360 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2d370 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2d380 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2d390 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2d3a0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2d3b0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2d3c0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2d3d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2d3e0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2d3f0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2d400 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2d410 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2d420 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2d430 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2d440 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2d450 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2d460 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2d470 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2d480 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2d490 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2d4a0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2d4b0 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2d4c0 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2d4d0 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2d4e0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2d4f0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2d500 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2d510 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2d520 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2d530 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2d540 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2d550 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2d560 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2d570 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2d580 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2d590 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2d5a0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2d5b0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2d5c0 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2d5d0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2d5e0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2d5f0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2d600 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2d610 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2d620 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2d630 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2d640 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2d650 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2d660 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2d670 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2d680 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2d690 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2d6a0 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2d6b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2d6c0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2d6d0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2d6e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2d6f0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2d700 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2d710 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2d720 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2d730 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2d740 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2d750 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2d760 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2d770 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2d780 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2d790 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2d7a0 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2d7b0 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2d7c0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2d7d0 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2d7e0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2d7f0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2d800 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2d810 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2d820 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2d830 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2d840 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2d850 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2d860 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2d870 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2d880 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2d890 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2d8a0 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2d8b0 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2d8c0 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2d8d0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2d8e0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2d8f0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2d900 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2d910 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2d920 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2d930 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2d940 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2d950 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74  NE int btreeNext
2d960 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d970 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2d980 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
2d990 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2d9a0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2d9b0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2d9c0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2d9d0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d9e0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d9f0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2da00 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2da10 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2da20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2da30 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2da40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2da50 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2da60 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2da70 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2da80 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2da90 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2daa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dab0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2dac0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2dad0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2dae0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2daf0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2db00 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2db10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2db20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2db30 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2db40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2db50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2db60 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2db70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2db80 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2db90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2dba0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2dbb0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2dbc0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2dbd0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2dbe0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2dbf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2dc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2dc10 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2dc20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2dc30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2dc40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2dc50 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2dc60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2dc70 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2dc80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2dc90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2dca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2dcb0 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2dcc0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2dcd0 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2dce0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2dcf0 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2dd00 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2dd10 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2dd20 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2dd30 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2dd40 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2dd50 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2dd60 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2dd70 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2dd80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2dd90 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2dda0 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2ddb0 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2ddc0 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2ddd0 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2dde0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2ddf0 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2de00 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2de10 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2de20 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2de30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2de40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2de50 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2de60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2de70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2de80 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2de90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2dea0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2deb0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2dec0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2ded0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2dee0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2def0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2df00 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2df10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2df20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2df30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2df40 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2df50 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2df60 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2df70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2df80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2df90 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2dfa0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2dfb0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2dfc0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2dfd0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2dfe0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2dff0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2e000 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2e010 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2e020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e030 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2e040 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2e050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2e070 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2e080 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2e090 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e0a0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2e0b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2e0c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2e0d0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2e0e0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e0f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e100 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2e110 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2e120 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2e130 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2e140 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2e150 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e160 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2e170 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e180 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2e190 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2e1a0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2e1b0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70  ValidOvfl);.  *p
2e1c0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
2e1d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e1e0 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2e1f0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2e200 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67  r, pRes);.  pPag
2e210 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e230 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69   if( (++pCur->ai
2e240 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e250 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
2e260 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
2e270 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e280 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
2e290 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2e2a0 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  es);.  }.  if( p
2e2b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e2c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e2d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2e2e0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2e2f0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2e300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2e310 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2e320 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2e330 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2e340 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2e350 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2e360 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2e370 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2e380 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2e390 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2e3a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2e3b0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2e3c0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2e3d0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2e3e0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2e3f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2e400 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2e410 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2e420 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2e430 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2e440 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2e450 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2e460 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2e470 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2e480 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2e490 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2e4a0 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2e4b0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2e4c0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2e4d0 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2e4e0 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2e4f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2e500 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2e510 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2e520 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2e530 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2e540 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2e550 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2e560 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2e570 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2e580 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2e590 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2e5a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2e5b0 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2e5c0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2e5d0 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2e5e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2e5f0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2e600 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2e610 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2e620 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2e630 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2e640 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2e650 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2e660 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2e670 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2e680 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2e690 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2e6a0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2e6b0 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2e6c0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2e6d0 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2e6e0 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2e6f0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2e700 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2e710 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2e720 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2e730 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2e740 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e750 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2e760 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2e770 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2e780 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2e790 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2e7a0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2e7b0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2e7c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e7d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2e7e0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2e7f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2e800 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2e810 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2e820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e830 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2e840 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2e850 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e860 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2e870 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2e880 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2e890 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2e8a0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2e8b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e8c0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2e8d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2e8e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e8f0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2e900 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2e910 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2e920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e930 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e940 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2e950 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2e960 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2e970 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2e980 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2e990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e9a0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2e9b0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2e9c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e9d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2e9e0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2e9f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2ea00 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2ea10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2ea20 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2ea30 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2ea40 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2ea50 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2ea60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2ea70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ea80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2ea90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2eaa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2eab0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2eac0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ead0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2eae0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2eaf0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2eb00 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2eb10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2eb20 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
2eb30 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2eb40 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2eb50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2eb60 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2eb70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2eb80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2eb90 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2eba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2ebb0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2ebc0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
2ebd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2ebe0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2ebf0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2ec00 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2ec10 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
2ec20 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2ec30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ec40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ec50 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2ec60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2ec70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2ec80 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2ec90 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2eca0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2ecb0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2ecc0 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  );..    pCur->ai
2ecd0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2ece0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2ecf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ed00 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2ed10 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2ed20 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2ed30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2ed40 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2ed50 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2ed60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ed70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2ed80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2ed90 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
2eda0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2edb0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2edc0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2edd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2ede0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2edf0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2ee00 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2ee10 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2ee20 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2ee30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2ee40 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2ee50 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2ee60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2ee70 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2ee80 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2ee90 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2eea0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2eeb0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2eec0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2eed0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2eee0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2eef0 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2ef00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2ef10 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2ef20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ef30 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2ef40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2ef50 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2ef60 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2ef70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ef80 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2ef90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2efa0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2efb0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2efc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2efd0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2efe0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2eff0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2f000 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2f010 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2f020 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2f030 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2f040 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2f050 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2f060 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2f070 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2f080 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2f090 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2f0a0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2f0b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2f0c0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2f0d0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2f0e0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2f0f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2f100 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2f110 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2f120 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2f130 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2f140 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
2f150 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
2f160 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
2f170 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
2f180 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2f190 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
2f1a0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
2f1b0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
2f1c0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
2f1d0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
2f1e0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
2f1f0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
2f200 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
2f210 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
2f220 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
2f230 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f240 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
2f250 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
2f260 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
2f270 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
2f280 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
2f290 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
2f2a0 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
2f2b0 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
2f2c0 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
2f2d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2f2e0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
2f2f0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
2f300 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
2f310 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
2f320 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
2f330 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2f340 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2f350 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
2f360 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
2f370 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
2f380 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
2f390 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
2f3a0 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
2f3b0 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
2f3c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2f3d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
2f3e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
2f3f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2f400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f410 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
2f420 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
2f430 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
2f440 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
2f450 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
2f460 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
2f470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
2f480 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
2f490 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
2f4a0 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
2f4b0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
2f4c0 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
2f4d0 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
2f4e0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
2f4f0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
2f500 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
2f510 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
2f520 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
2f530 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
2f540 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
2f550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2f560 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2f570 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
2f580 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f590 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
2f5a0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
2f5b0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
2f5c0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
2f5d0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
2f5e0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
2f5f0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
2f600 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2f610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f620 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2f630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f640 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2f650 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2f660 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
2f670 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
2f680 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
2f690 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
2f6a0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2f6b0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
2f6c0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2f6d0 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
2f6e0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
2f6f0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
2f700 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2f710 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
2f720 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
2f730 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
2f740 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2f750 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
2f760 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
2f770 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f780 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
2f790 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
2f7a0 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
2f7b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f7c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f7d0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
2f7e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2f7f0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
2f800 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
2f810 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
2f820 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
2f830 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
2f840 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
2f850 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
2f860 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
2f870 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
2f880 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
2f890 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
2f8a0 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
2f8b0 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
2f8c0 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
2f8d0 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
2f8e0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
2f8f0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
2f900 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2f910 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
2f920 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2f930 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
2f940 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2f950 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
2f960 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
2f970 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
2f980 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
2f990 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2f9a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f9b0 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
2f9c0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2f9d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
2f9e0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
2f9f0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
2fa00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2fa10 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
2fa20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2fa30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2fa40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2fa50 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
2fa60 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
2fa70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2fa80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fa90 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
2faa0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2fab0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
2fac0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2fad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fae0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
2faf0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2fb00 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
2fb10 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
2fb20 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
2fb30 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
2fb40 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
2fb50 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
2fb60 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
2fb70 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
2fb80 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2fb90 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
2fba0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
2fbb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2fbc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fbd0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2fbe0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2fbf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
2fc00 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2fc10 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
2fc20 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
2fc30 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
2fc40 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
2fc50 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
2fc60 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
2fc70 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
2fc80 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
2fc90 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
2fca0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
2fcb0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
2fcc0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
2fcd0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2fce0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2fcf0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2fd00 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
2fd10 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
2fd20 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
2fd30 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2fd40 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
2fd50 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
2fd60 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
2fd70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
2fd80 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2fd90 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2fda0 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
2fdb0 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
2fdc0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2fdd0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2fde0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
2fdf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2fe00 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
2fe10 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2fe20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
2fe30 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
2fe40 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
2fe50 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2fe60 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
2fe70 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2fe80 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2fe90 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2fea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2feb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2fec0 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
2fed0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2fee0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
2fef0 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
2ff00 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
2ff10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2ff20 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2ff30 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
2ff40 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
2ff50 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
2ff60 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
2ff70 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2ff80 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2ff90 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2ffa0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2ffb0 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
2ffc0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
2ffd0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
2ffe0 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
2fff0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
30000 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30010 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
30020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
30030 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30040 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
30050 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
30060 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
30070 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
30080 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
30090 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
300a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
300b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
300c0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
300d0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
300e0 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
300f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
30100 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
30110 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
30120 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
30130 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
30140 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
30150 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
30160 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
30170 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
30180 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
30190 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
301a0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
301b0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
301c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
301d0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
301e0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
301f0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
30200 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
30210 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
30220 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
30230 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
30240 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
30250 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
30260 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
30270 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
30280 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
30290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
302a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
302b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
302c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
302d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
302e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
302f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30300 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
30310 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
30320 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30330 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
30340 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30350 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
30360 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
30370 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
30380 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30390 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
303a0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
303b0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
303c0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
303d0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
303e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
303f0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
30400 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
30410 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
30420 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
30430 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
30440 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30450 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30460 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30470 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
30480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30490 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
304a0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
304b0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
304c0 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
304d0 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
304e0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
304f0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
30500 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
30510 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
30520 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
30530 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
30540 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
30550 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
30560 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
30570 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
30580 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
30590 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
305a0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
305b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
305c0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
305d0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
305e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
305f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
30600 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
30610 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
30620 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30630 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30640 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
30650 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
30660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
30670 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30680 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30690 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
306a0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
306b0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
306c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
306d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
306e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
306f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
30700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30720 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30730 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
30740 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30760 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
30770 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
30780 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
30790 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
307a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
307b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
307c0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
307d0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
307e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
307f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
30800 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
30810 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
30820 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
30830 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
30840 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
30850 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
30860 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
30870 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
30880 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
30890 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
308a0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
308b0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
308c0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
308d0 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
308e0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
308f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30910 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
30920 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30930 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
30940 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
30950 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
30960 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
30970 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30980 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30990 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
309a0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
309b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
309c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
309d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
309e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
309f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30a10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30a20 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
30a30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
30a40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
30a60 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
30a70 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
30a80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30a90 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30ab0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
30ac0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
30ad0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30ae0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
30af0 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
30b00 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
30b10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
30b20 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
30b30 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
30b40 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
30b50 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
30b60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30b70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
30b80 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
30b90 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
30ba0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30bb0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30bc0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
30bd0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
30be0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
30bf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
30c00 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
30c10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30c20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30c30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30c40 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
30c50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30c60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30c70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30c80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30c90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
30ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
30cb0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
30cc0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
30cd0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
30ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30cf0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
30d00 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
30d10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30d20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
30d30 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
30d40 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
30d50 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
30d60 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
30d70 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
30d80 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
30d90 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
30da0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
30db0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
30dc0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
30dd0 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
30de0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
30df0 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
30e00 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
30e10 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
30e20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
30e30 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
30e40 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
30e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
30e60 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
30e70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30e80 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
30e90 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
30ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
30eb0 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
30ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ed0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
30ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30ef0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30f30 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
30f40 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
30f50 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
30f60 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
30f70 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
30f80 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
30f90 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
30fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
30fb0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
30fc0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
30fd0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
30fe0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
30ff0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
31000 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
31010 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
31020 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
31030 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
31040 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31080 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
31090 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
310a0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
310b0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
310c0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
310d0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
310e0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
310f0 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
31100 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
31110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31120 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
31130 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31140 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
31160 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
31170 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
31180 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
31190 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  t .         || (
311a0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c  iPage==nearby ||
311b0 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26   (iPage<nearby &
311c0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
311d0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29  _LE)) .        )
311e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
311f0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
31200 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
31210 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
31220 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
31230 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
31240 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
31250 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
31260 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
31270 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
31290 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
312a0 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
312b0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
312c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
312d0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
312e0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
312f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
31300 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31310 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31320 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
31330 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
31340 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
31350 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
31360 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
31370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31380 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31390 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
313a0 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
313b0 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
313c0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
313d0 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45  pPgno)? PAGER_GE
313e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
313f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31400 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
31410 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
31420 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
31430 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
31440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
31460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31470 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31480 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31490 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
314a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
314b0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
314c0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
314d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
314e0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
314f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
31510 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
31520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31530 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
31540 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
31550 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
31560 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
31570 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
31580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
31590 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
315a0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
315b0 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
315c0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
315d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
315e0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
315f0 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
31600 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
31610 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
31620 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
31630 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
31640 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
31650 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
31660 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
31670 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
31680 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
31690 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
316a0 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
316b0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
316c0 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
316d0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
316e0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
316f0 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
31700 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
31710 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
31720 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
31730 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
31740 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
31750 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
31760 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
31770 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
31780 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
31790 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
317a0 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
317b0 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
317c0 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
317d0 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
317e0 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
317f0 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
31800 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
31810 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
31820 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
31830 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
31840 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
31850 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
31860 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
31870 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
31880 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
31890 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
318a0 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
318b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
318c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
318d0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
318e0 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
318f0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
31900 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
31910 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
31920 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
31930 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
31940 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
31950 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
31960 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
31970 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
31980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31990 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
319a0 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
319b0 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
319c0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
319d0 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
319e0 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
319f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31a00 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
31a10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31a20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31a30 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
31a40 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
31a50 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
31a60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31a70 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
31a80 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
31a90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31aa0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
31ab0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
31ac0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
31ad0 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
31ae0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
31af0 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
31b00 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
31b10 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
31b20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
31b30 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
31b40 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
31b50 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
31b60 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
31b70 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
31b80 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
31b90 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
31ba0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
31bb0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
31bc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
31bd0 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
31be0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
31bf0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
31c00 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
31c10 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
31c20 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
31c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
31c40 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
31c50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
31c60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
31c70 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
31c80 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
31c90 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
31ca0 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
31cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31cc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31cd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31ce0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
31cf0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
31d00 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
31d10 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31d20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31d30 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
31d40 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
31d50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
31d60 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
31d70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
31d80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31d90 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
31da0 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
31db0 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
31dc0 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
31dd0 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
31de0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
31df0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
31e00 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
31e10 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
31e20 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
31e30 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
31e40 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
31e50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31e60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
31e70 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
31e80 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
31e90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31eb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
31ec0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
31ed0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Page = 0;.    }.
31ee0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
31ef0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
31f00 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
31f10 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
31f20 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
31f30 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31f40 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
31f50 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
31f60 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
31f70 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
31f80 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
31f90 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
31fa0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
31fb0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
31fc0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
31fd0 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
31fe0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31ff0 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
32000 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
32010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32020 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
32030 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
32040 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
32050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32060 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
32070 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
32080 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
32090 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
320a0 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
320b0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
320c0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
320d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
320e0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
320f0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
32100 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
32110 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
32120 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
32130 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
32140 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
32150 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
32160 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
32170 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
32180 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
32190 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
321a0 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
321b0 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
321c0 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
321d0 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
321e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
321f0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
32200 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
32210 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
32220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
32230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
32240 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
32250 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
32260 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
32270 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
32280 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
322a0 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
322b0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
322c0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
322e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
322f0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
32300 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
32310 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
32320 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
32330 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
32340 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
32350 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32370 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
32380 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
32390 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
323a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
323d0 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
32400 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
32410 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
32420 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
32430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
32440 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
32450 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
32460 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
32470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
32480 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
32490 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
324a0 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
324b0 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
324c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
324d0 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
324e0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
324f0 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
32500 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
32510 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
32520 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
32530 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
32540 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
32550 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
32560 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
32570 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
32580 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
32590 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
325a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
325b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
325c0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
325d0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
325e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
325f0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
32600 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32610 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
32620 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
32630 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
32640 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
32650 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
32660 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
32670 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
32680 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
32690 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
326a0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
326b0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
326c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
326d0 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
326e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
326f0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
32700 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
32710 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
32720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32730 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
32740 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
32750 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32760 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
32770 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
32780 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
32790 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
327a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
327b0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
327c0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
327d0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
327e0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
327f0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
32800 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
32810 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
32820 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
32830 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
32840 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
32850 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
32860 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
32870 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
32880 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
32890 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
328a0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
328b0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
328c0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
328d0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
328e0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
328f0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
32900 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
32910 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
32920 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
32930 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
32940 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
32950 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
32960 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
32970 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
32980 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
32990 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
329a0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
329b0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
329c0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
329d0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
329e0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
329f0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
32a00 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
32a10 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
32a20 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
32a30 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
32a40 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
32a50 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
32a60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
32a70 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
32a80 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
32a90 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
32aa0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
32ab0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32ac0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
32ad0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
32ae0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
32af0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
32b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32b10 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32b20 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
32b30 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
32b40 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
32b50 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
32b60 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
32b70 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
32b80 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
32b90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
32ba0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
32bb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32bc0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
32bd0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
32bf0 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
32c00 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
32c10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
32c20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
32c30 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
32c40 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
32c50 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
32c60 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
32c70 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
32c80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
32c90 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
32ca0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
32cb0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
32cc0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
32cd0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
32ce0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
32cf0 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
32d00 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
32d10 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
32d20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
32d30 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
32d40 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
32d50 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
32d60 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
32d70 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
32d80 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
32d90 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
32da0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
32db0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
32dc0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
32dd0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
32de0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
32df0 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
32e00 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
32e10 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
32e20 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
32e30 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
32e40 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
32e50 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
32e60 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
32e70 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
32e80 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
32e90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
32ea0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
32eb0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
32ec0 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
32ed0 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
32ee0 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
32ef0 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
32f00 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
32f10 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
32f20 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
32f30 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
32f40 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
32f50 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
32f60 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
32f70 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
32f80 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
32f90 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
32fa0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
32fb0 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
32fc0 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
32fd0 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
32fe0 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
32ff0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
33000 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
33010 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
33020 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
33030 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
33040 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
33050 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
33060 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
33070 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33080 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
33090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
330a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
330b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
330c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
330d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
330e0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
330f0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
33100 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
33110 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
33120 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
33130 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
33140 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
33150 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33160 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
33170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
33180 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
33190 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
331a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
331b0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
331c0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
331d0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
331e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
331f0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
33200 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
33210 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
33220 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
33230 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
33240 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
33260 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
33270 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
33280 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
33290 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
332a0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
332b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
332c0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
332d0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
332e0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
332f0 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
33300 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
33310 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
33320 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
33330 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
33340 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
33350 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
33360 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
33370 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
33380 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
33390 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
333a0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
333b0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
333c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
333d0 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
333e0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
333f0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
33400 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
33410 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
33420 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
33430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33440 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
33450 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
33460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33470 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
33480 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
33490 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
334a0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
334b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
334c0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
334d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
334e0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
334f0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
33500 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
33510 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
33520 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
33530 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
33540 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
33550 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
33560 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
33570 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
33580 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
33590 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
335a0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
335b0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
335c0 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
335d0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
335e0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
335f0 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
33600 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
33610 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
33620 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
33630 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
33640 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
33650 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
33660 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33670 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72   given Cell.  Wr
33680 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c  ite the.** local
33690 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20   Cell size (the 
336a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
336b0 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  on the original 
336c0 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a  page, omitting.*
336d0 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f  * overflow) into
336e0 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61   *pnSize..*/.sta
336f0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
33700 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
33710 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
33720 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
33730 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c  ontains the Cell
33740 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
33750 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f  har *pCell,    /
33760 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
33770 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31  the Cell */.  u1
33780 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  6 *pnSize       
33790 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
337a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
337b0 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  Cell here */.){.
337c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
337d0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
337e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
337f0 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
33800 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
33810 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
33820 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
33830 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33840 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
33850 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
33860 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
33870 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
33880 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69   &info);.  *pnSi
33890 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
338a0 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63  .  if( info.nLoc
338b0 61 6c 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  al==info.nPayloa
338c0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
338d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
338e0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
338f0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
33900 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
33910 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
33920 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20  ll+info.nSize-1 
33930 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
33940 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
33950 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33960 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33970 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
33980 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
33990 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
339a0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
339b0 28 70 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53  (pCell + info.nS
339c0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65  ize - 4);.  asse
339d0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
339e0 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
339f0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
33a00 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
33a10 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
33a20 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
33a30 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
33a40 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
33a50 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
33a60 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
33a70 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
33a80 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  && (info.nPayloa
33a90 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
33aa0 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
33ab0 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
33ac0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
33ad0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
33ae0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
33af0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
33b00 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
33b10 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
33b20 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
33b30 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
33b40 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
33b50 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
33b60 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
33b70 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
33b80 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
33b90 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
33ba0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33bb0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
33bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
33bd0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
33be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33bf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33c00 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
33c10 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
33c20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
33c30 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
33c40 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
33c50 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
33c60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
33c70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
33c80 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
33c90 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
33ca0 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
33cb0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
33cc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
33cd0 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
33ce0 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
33cf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
33d00 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
33d10 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
33d20 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
33d30 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
33d40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
33d50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
33d60 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
33d70 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
33d80 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
33d90 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
33da0 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
33db0 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
33dc0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
33dd0 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
33de0 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
33df0 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
33e00 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
33e10 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
33e20 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
33e30 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
33e40 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
33e50 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
33e60 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
33e70 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
33e80 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
33e90 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
33ea0 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
33eb0 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
33ec0 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
33ed0 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
33ee0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
33ef0 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
33f00 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
33f10 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
33f20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
33f30 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
33f40 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
33f50 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
33f60 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
33f70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
33f80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33fa0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
33fb0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
33fc0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
33fd0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
33fe0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33ff0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
34000 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
34010 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34020 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
34030 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
34040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34050 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
34060 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
34070 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
34080 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
34090 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
340a0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
340b0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
340c0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
340d0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
340e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
340f0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
34100 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
34110 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
34120 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
34130 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
34140 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
34150 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
34160 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
34170 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
34180 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
34190 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
341a0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
341b0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
341c0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
341d0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
341e0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
341f0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
34200 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
34210 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
34220 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
34230 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
34240 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
34250 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
34260 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
34270 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34290 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
342a0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
342b0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
342c0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
342d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
342e0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
342f0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
34300 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
34310 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
34320 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
34330 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
34340 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
34350 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
34360 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
34370 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
34380 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
34390 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
343a0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
343b0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
343c0 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
343d0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
343e0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
343f0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
34400 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34410 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
34420 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
34430 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
34440 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
34450 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
34460 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
34470 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
34480 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34490 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
344a0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
344b0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
344c0 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
344d0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
344e0 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
344f0 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
34500 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
34510 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
34520 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
34530 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
34540 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
34550 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
34560 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34570 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34580 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34590 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
345a0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
345b0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
345c0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
345d0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
345e0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
345f0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
34600 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
34610 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
34620 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
34630 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
34640 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
34650 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
34660 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
34670 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
34680 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
34690 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
346a0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
346b0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
346c0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
346d0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
346e0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
346f0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
34700 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
34710 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
34720 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
34730 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
34740 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
34750 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
34760 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
34770 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
34780 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
34790 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
347a0 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
347b0 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
347c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
347d0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
347e0 64 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c  d */.  if( nPayl
347f0 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
34800 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
34810 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
34820 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
34830 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
34840 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
34850 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
34860 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
34870 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
34880 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
34890 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
348a0 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
348b0 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
348c0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
348d0 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
348e0 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
348f0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34900 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
34910 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34920 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
34930 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
34940 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
34950 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
34960 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
34970 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
34980 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
34990 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
349a0 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
349b0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
349c0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
349d0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
349e0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
349f0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
34a00 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
34a10 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
34a20 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
34a30 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
34a40 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
34a50 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
34a60 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
34a70 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
34a80 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
34a90 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
34aa0 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
34ab0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
34ac0 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
34ad0 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
34ae0 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
34b00 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
34b10 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
34b20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
34b30 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
34b40 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
34b50 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
34b60 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
34b70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
34b80 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
34b90 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
34ba0 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
34bb0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
34bc0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
34bd0 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
34be0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
34bf0 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
34c00 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
34c10 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
34c20 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
34c30 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
34c40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
34c50 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
34c60 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
34c70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
34c80 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
34c90 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
34ca0 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  er==(int)(info.p
34cb0 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
34cc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34cd0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e  info.nKey==pX->n
34ce0 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
34cf0 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
34d00 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
34d10 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
34d20 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
34d30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
34d40 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
34d50 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
34d60 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
34d70 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
34d80 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
34d90 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
34da0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
34db0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
34dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34dd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34de0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
34df0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
34e00 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
34e10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34e20 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
34e30 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34e40 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34e50 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
34e60 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
34e70 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
34e80 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
34e90 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
34ea0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
34eb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34ec0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
34ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
34ee0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
34ef0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
34f00 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
34f10 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
34f20 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
34f30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34f40 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
34f50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34f60 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34f70 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
34f80 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
34f90 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
34fa0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
34fb0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
34fc0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
34fd0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
34fe0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
34ff0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
35000 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
35010 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
35020 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
35030 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
35040 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
35050 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
35060 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
35070 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
35080 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
35090 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
350a0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
350b0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
350c0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
350d0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
350e0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
350f0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
35100 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
35110 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
35120 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
35130 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
35140 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
35150 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
35160 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
35170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35180 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
35190 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
351a0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
351b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
351c0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
351d0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
351e0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
351f0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
35200 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35210 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35220 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
35230 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
35240 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
35250 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
35260 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
35270 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
35280 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
35290 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
352a0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
352b0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
352c0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
352d0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
352e0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
352f0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
35300 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
35310 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
35320 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
35330 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
35340 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35350 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
35360 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
35370 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
35380 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
35390 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
353a0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
353b0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
353c0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
353d0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
353e0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
353f0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
35400 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
35410 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
35420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
35430 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35440 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
35450 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35460 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
35470 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
35480 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35490 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
354a0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
354b0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
354c0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
354d0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
354e0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
354f0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
35500 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
35510 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
35520 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
35530 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
35540 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
35550 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
35560 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
35570 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
35580 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
35590 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
355a0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
355b0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
355c0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
355d0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
355e0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
355f0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
35600 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
35610 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
35620 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35630 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
35640 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
35650 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
35660 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
35670 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
35680 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
35690 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
356a0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
356b0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
356c0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
356d0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
356e0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
356f0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
35700 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
35710 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
35720 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35730 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35740 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
35750 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
35760 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
35770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
35780 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
35790 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
357a0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
357b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
357c0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
357d0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
357e0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
357f0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
35800 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
35810 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
35820 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d  ceLeft -= n;.  }
35830 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
35840 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
35850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35860 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
35870 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
35880 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
35890 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
358a0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
358b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
358c0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
358d0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
358e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
358f0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
35900 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
35910 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
35920 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
35930 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
35940 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
35950 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
35960 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
35970 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
35980 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
35990 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
359a0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
359b0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
359c0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
359d0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
359e0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
359f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
35a00 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
35a10 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
35a20 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
35a30 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
35a40 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
35a50 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
35a60 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
35a70 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
35a80 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
35a90 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
35aa0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
35ab0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
35ac0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
35ad0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
35ae0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
35af0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
35b00 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
35b10 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
35b20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
35b30 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
35b40 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
35b50 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
35b60 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
35b70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35b80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35b90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35ba0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
35bb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35bc0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
35bd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
35be0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
35bf0 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
35c00 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
35c10 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
35c20 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
35c30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35c40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
35c50 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
35c60 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
35c70 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
35c80 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
35c90 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
35ca0 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
35cb0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
35cc0 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
35cd0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35ce0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
35cf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35d00 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
35d10 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
35d20 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
35d30 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
35d40 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
35d50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
35d60 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
35d70 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
35d80 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
35d90 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
35da0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
35db0 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
35dc0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
35dd0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
35de0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
35df0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
35e00 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
35e10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
35e20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
35e30 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
35e40 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
35e50 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
35e60 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
35e70 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
35e80 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
35e90 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
35ea0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
35eb0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
35ec0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
35ed0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
35ee0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
35ef0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
35f00 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
35f10 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
35f20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
35f30 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
35f40 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
35f50 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
35f60 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
35f70 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
35f80 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
35f90 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
35fa0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
35fb0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
35fc0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
35fd0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
35fe0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
35ff0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
36000 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
36010 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
36020 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
36030 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
36040 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
36050 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
36060 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
36070 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
36080 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
36090 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
360a0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
360b0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
360c0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
360d0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
360e0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
360f0 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52  ented..**.** *pR
36100 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45  C must be SQLITE
36110 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f  _OK when this ro
36120 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
36130 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36140 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
36150 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
36160 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
36170 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
36180 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
36190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
361a0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
361b0 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
361c0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
361d0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
361e0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
361f0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
36200 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
36210 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
36220 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
36230 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
36240 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
36250 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
36260 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
36270 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
36280 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
36290 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
362a0 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
362b0 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
362c0 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
362d0 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
362e0 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
362f0 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
36300 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
36310 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
36320 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
36330 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
36340 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
36350 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
36360 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
36370 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
36380 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
36390 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
363a0 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20   */.  u8 *pIns; 
363b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
363c0 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61  oint in pPage->a
363d0 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20  CellIdx[] where 
363e0 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  no cell inserted
363f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   */..  assert( *
36400 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRC==SQLITE_OK )
36410 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
36420 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
36430 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
36440 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
36450 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
36460 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
36470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
36480 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
36490 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
364a0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
364b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
364c0 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
364d0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
364e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
364f0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
36500 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
36510 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
36520 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36540 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
36550 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
36560 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
36570 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
36580 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
36590 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
365a0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
365b0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
365c0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
365d0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
365e0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
365f0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
36600 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
36610 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
36620 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
36630 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
36640 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
36650 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
36660 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
36670 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
36680 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
36690 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
366a0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
366b0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
366c0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50    assert( sz==pP
366d0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
366e0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
366f0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
36700 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
36710 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
36720 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
36730 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
36740 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
36750 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c  cpy(pTemp, pCell
36760 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65  , sz);.      pCe
36770 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
36780 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
36790 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
367a0 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
367b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
367c0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
367d0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
367e0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
367f0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
36800 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
36810 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
36820 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
36830 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
36840 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
36850 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
36860 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
36870 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
36880 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
36890 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
368a0 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
368b0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
368c0 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
368d0 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
368e0 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
368f0 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
36900 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
36910 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
36920 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36930 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
36940 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
36950 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
36960 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
36970 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
36980 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
36990 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
369a0 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
369b0 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
369c0 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
369d0 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
369e0 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  i==pPage->aiOvfl
369f0 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20  [j-1]+1 );   /* 
36a00 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65  Overflows are se
36a10 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65  quential */.  }e
36a20 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
36a30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36a40 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
36a50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
36a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36a70 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
36a80 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
36a90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
36aa0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36ab0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36ac0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
36ad0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
36ae0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  a;.    assert( &
36af0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
36b00 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e  Offset]==pPage->
36b10 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20  aCellIdx );.    
36b20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
36b30 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
36b40 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
36b50 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
36b60 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
36b70 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
36b80 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
36b90 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
36ba0 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20  ing properties. 
36bb0 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
36bc0 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
36bd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36be0 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  idx >= 0 );.    
36bf0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70  assert( idx >= p
36c00 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
36c10 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  +2*pPage->nCell+
36c20 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  2 || CORRUPT_DB 
36c30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
36c40 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
36c50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
36c60 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
36c70 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
36c80 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
36c90 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
36ca0 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
36cb0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
36cc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
36cd0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
36ce0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
36cf0 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c  ns = pPage->aCel
36d00 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20  lIdx + i*2;.    
36d10 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20  memmove(pIns+2, 
36d20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e  pIns, 2*(pPage->
36d30 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20  nCell - i));.   
36d40 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20   put2byte(pIns, 
36d50 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  idx);.    pPage-
36d60 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a  >nCell++;.    /*
36d70 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
36d80 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ell count */.   
36d90 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61   if( (++data[pPa
36da0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d  ge->hdrOffset+4]
36db0 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67  )==0 ) data[pPag
36dc0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b  e->hdrOffset+3]+
36dd0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  +;.    assert( g
36de0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
36df0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
36e00 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])==pPage->nCell
36e10 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
36e20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36e30 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
36e40 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
36e50 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
36e60 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
36e70 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
36e80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36e90 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
36ea0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
36eb0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
36ec0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
36ed0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
36ee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
36ef0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
36f00 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
36f10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
36f20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65   }.}../*.** A Ce
36f30 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63  llArray object c
36f40 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65 20  ontains a cache 
36f50 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  of pointers and 
36f60 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63  sizes for a.** c
36f70 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75 65  onsecutive seque
36f80 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61  nce of cells tha
36f90 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20  t might be held 
36fa0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65  on multiple page
36fb0 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
36fc0 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43  ruct CellArray C
36fd0 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74  ellArray;.struct
36fe0 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69   CellArray {.  i
36ff0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
37000 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37010 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
37020 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  ell[] */.  MemPa
37030 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20  ge *pRef;       
37040 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
37050 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
37060 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
37070 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
37080 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
37090 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
370a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
370b0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
370c0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
370d0 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  ] */.};../*.** M
370e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65 6c  ake sure the cel
370f0 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20  l sizes at idx, 
37100 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b  idx+1, ..., idx+
37110 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  N-1 have been.**
37120 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74   computed..*/.st
37130 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61  atic void popula
37140 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c  teCellCache(Cell
37150 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64  Array *p, int id
37160 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  x, int N){.  ass
37170 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
37180 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29  dx+N<=p->nCell )
37190 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29  ;.  while( N>0 )
371a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
371b0 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20  >apCell[idx]!=0 
371c0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a  );.    if( p->sz
371d0 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a  Cell[idx]==0 ){.
371e0 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
371f0 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  idx] = p->pRef->
37200 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
37210 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
37220 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
37230 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52       assert( COR
37240 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20  RUPT_DB ||.     
37250 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65           p->szCe
37260 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66  ll[idx]==p->pRef
37270 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
37280 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
37290 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  dx]) );.    }.  
372a0 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d    idx++;.    N--
372b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
372c0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
372d0 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e  f the Nth elemen
372e0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72  t of the cell ar
372f0 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ray.*/.static SQ
37300 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31  LITE_NOINLINE u1
37310 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  6 computeCellSiz
37320 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
37330 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
37340 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
37350 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
37360 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d  ( p->szCell[N]==
37370 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c  0 );.  p->szCell
37380 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78  [N] = p->pRef->x
37390 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
373a0 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b  , p->apCell[N]);
373b0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43  .  return p->szC
373c0 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63  ell[N];.}.static
373d0 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53   u16 cachedCellS
373e0 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
373f0 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
37400 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
37410 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
37420 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72  p->szCell[N] ) r
37430 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b  eturn p->szCell[
37440 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d  N];.  return com
37450 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20  puteCellSize(p, 
37460 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  N);.}../*.** Arr
37470 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
37480 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
37490 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61   nCell b-tree pa
374a0 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a  ge cells. The .*
374b0 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79  * szCell[] array
374c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
374d0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
374e0 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  ach cell. This f
374f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61  unction.** repla
37500 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ces the current 
37510 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
37520 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f   pPg with the co
37530 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65  ntents of the ce
37540 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a  ll.** array..**.
37550 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** Some of the c
37560 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
37570 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
37580 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e  e stored in pPg.
37590 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
375a0 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70  n works around p
375b0 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
375c0 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67  y this by making
375d0 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a   a copy of any .
375e0 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65  ** such cells be
375f0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
37600 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
37610 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67  **.** The MemPag
37620 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  e.nFree field is
37630 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
37640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
37650 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
37660 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
37670 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74  he caller to set
37680 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a   it correctly..*
37690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 62  /.static int reb
376a0 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50  uildPage(.  MemP
376b0 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
376c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
376d0 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
376e0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
37710 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
37720 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
37730 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
37740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37750 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
37760 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
37770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37780 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
37790 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   sizes */.){.  c
377a0 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
377b0 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
377c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
377d0 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
377e0 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  Pg */.  u8 * con
377f0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
37800 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
37810 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
37820 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20  ata for pPg */. 
37830 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c   const int usabl
37840 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
37850 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
37860 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
37870 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53  = &aData[usableS
37880 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ize];.  int i;. 
37890 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20   u8 *pCellptr = 
378a0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
378b0 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
378c0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
378d0 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
378e0 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  er);.  u8 *pData
378f0 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74  ;..  i = get2byt
37900 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
37910 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70  ;.  memcpy(&pTmp
37920 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20  [i], &aData[i], 
37930 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b  usableSize - i);
37940 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64  ..  pData = pEnd
37950 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
37960 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
37970 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
37980 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53  ll[i];.    if( S
37990 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65  QLITE_WITHIN(pCe
379a0 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29  ll,aData,pEnd) )
379b0 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  {.      pCell = 
379c0 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44  &pTmp[pCell - aD
379d0 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata];.    }.    
379e0 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b  pData -= szCell[
379f0 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
37a00 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74  (pCellptr, (pDat
37a10 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  a - aData));.   
37a20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
37a30 20 20 20 20 69 66 28 20 70 44 61 74 61 20 3c 20      if( pData < 
37a40 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72  pCellptr ) retur
37a50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
37a60 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70  _BKPT;.    memcp
37a70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20  y(pData, pCell, 
37a80 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  szCell[i]);.    
37a90 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
37aa0 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]==pPg->xCellSiz
37ab0 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c  e(pPg, pCell) ||
37ac0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
37ad0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43     testcase( szC
37ae0 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65  ell[i]!=pPg->xCe
37af0 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c  llSize(pPg,pCell
37b00 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ) );.  }..  /* T
37b10 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69  he pPg->nFree fi
37b20 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69  eld is now set i
37b30 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20  ncorrectly. The 
37b40 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20  caller will fix 
37b50 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43  it. */.  pPg->nC
37b60 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70  ell = nCell;.  p
37b70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
37b80 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
37b90 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29  aData[hdr+1], 0)
37ba0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
37bb0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d  ata[hdr+3], pPg-
37bc0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62  >nCell);.  put2b
37bd0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
37be0 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61  ], pData - aData
37bf0 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37  );.  aData[hdr+7
37c00 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75  ] = 0x00;.  retu
37c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37c20 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37c30 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37c40 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37c50 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37c60 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63  rray szCell.** c
37c70 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
37c80 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
37c90 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
37ca0 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
37cb0 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74  pts to .** add t
37cc0 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20  he cells stored 
37cd0 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  in the array to 
37ce0 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20  page pPg. If it 
37cf0 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20  cannot (because 
37d00 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65  .** the page nee
37d10 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d  ds to be defragm
37d20 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  ented before the
37d30 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29   cells will fit)
37d40 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  , non-zero.** is
37d50 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
37d60 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c  wise, if the cel
37d70 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63  ls are added suc
37d80 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20  cessfully, zero 
37d90 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
37da0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
37db0 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74  Cellptr points t
37dc0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
37dd0 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  y in the cell-po
37de0 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28  inter array.** (
37df0 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67  part of page pPg
37e00 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41  ) to populate. A
37e10 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c  fter cell apCell
37e20 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74  [0] is written t
37e30 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f  o the.** page bo
37e40 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66  dy, a 16-bit off
37e50 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  set is written t
37e60 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20  o pCellptr. And 
37e70 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a  so on, for each.
37e80 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ** cell in the a
37e90 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20  rray. It is the 
37ea0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
37eb0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
37ec0 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69  ensure.** that i
37ed0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
37ee0 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74  rwrite this part
37ef0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   of the cell-poi
37f00 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  nter array..**.*
37f10 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
37f20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
37f30 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74  *ppData points t
37f40 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
37f50 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  he .** content a
37f60 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e  rea on page pPg.
37f70 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
37f80 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
37f90 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a   is extended,.**
37fa0 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61   *ppData is upda
37fb0 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
37fc0 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66  the new start of
37fd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
37fe0 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  a.** before retu
37ff0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  rning..**.** Fin
38000 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70  ally, argument p
38010 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Begin points to 
38020 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
38030 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
38040 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
38050 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
38060 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72  by this page for
38070 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
38080 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61  r area (for.** a
38090 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a  ll cells - not j
380a0 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74  ust those insert
380b0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
380c0 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20  t call). If the 
380d0 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20  content.** area 
380e0 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64  must be extended
380f0 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20   to before this 
38100 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
38110 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c  o accomodate all
38120 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  .** cells in apC
38130 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20  ell[], then the 
38140 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74  cells do not fit
38150 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73   and non-zero is
38160 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
38170 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73  atic int pageIns
38180 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  ertArray(.  MemP
38190 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
381a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
381b0 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73  age to add cells
381c0 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65   to */.  u8 *pBe
381d0 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  gin,            
381e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
381f0 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  of cell-pointer 
38200 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a  array */.  u8 **
38210 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
38220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
38230 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65  /OUT: Page conte
38240 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72  nt -area pointer
38250 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
38260 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
38270 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38280 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   to cell-pointer
38290 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
382a0 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
382b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
382c0 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
382d0 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  l to add */.  in
382e0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
382f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38300 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
38310 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a   to add to pPg *
38320 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
38330 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
38340 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
38350 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
38360 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61  t i;.  u8 *aData
38370 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
38380 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70   u8 *pData = *pp
38390 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64  Data;.  int iEnd
383a0 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
383b0 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  l;.  assert( COR
383c0 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e  RUPT_DB || pPg->
383d0 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  hdrOffset==0 ); 
383e0 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
383f0 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a  ed on page 1 */.
38400 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
38410 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<iEnd; i++){.  
38420 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20    int sz, rc;.  
38430 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20    u8 *pSlot;.   
38440 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c   sz = cachedCell
38450 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29  Size(pCArray, i)
38460 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61 74 61  ;.    if( (aData
38470 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b  [1]==0 && aData[
38480 32 5