/ Hex Artifact Content
Login

Artifact 7a45743fb947c89bd6c972bfb18c8f80c070ad51:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
55d0: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
55e0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
55f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5610: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5620: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5640: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5660: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5670: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5690: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
56a0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
56b0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
56c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
56d0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
56e0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
56f0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5700: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5710: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5720: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5730: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5740: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5750: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5760: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5770: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5780: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5790: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
57a0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
57b0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
57c0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
57d0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
57e0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
57f0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5800: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5810: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5820: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5830: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5840: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5850: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5860: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5870: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5880: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5890: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
58a0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
58b0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
58c0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
58d0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
58e0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
58f0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5900: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5910: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5920: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5930: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5940: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5950: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5960: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5970: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5980: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5990: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
59a0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
59b0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
59c0: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
59d0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
59e0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
59f0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5a00: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5a10: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5a20: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5a30: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5a40: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5a50: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5a60: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5a70: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5a80: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
5a90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
5aa0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
5ab0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
5ac0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
5ad0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
5ae0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5af0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5b00: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5b10: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5b20: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5b30: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5b40: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5b50: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5b60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5b70: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5b80: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
5b90: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5ba0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
5bb0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
5bc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
5bd0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
5be0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
5bf0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
5c00: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
5c10: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
5c20: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
5c30: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
5c40: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
5c50: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
5c60: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
5c70: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
5c80: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
5c90: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
5ca0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
5cb0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
5cc0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
5cd0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
5ce0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5cf0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
5d00: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
5d10: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
5d20: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
5d30: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
5d40: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
5d50: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5d60: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
5d70: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
5d80: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
5d90: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
5da0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5db0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
5dc0: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
5dd0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
5de0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
5df0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
5e00: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
5e10: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
5e20: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
5e30: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
5e40: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
5e50: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
5e60: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
5e70: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
5e80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5e90: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5ea0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5eb0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5ec0: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5ed0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5ef0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
5f10: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
5f20: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
5f30: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
5f40: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5f50: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5f60: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5f70: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5f80: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
5f90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
5fa0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
5fb0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
5fc0: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
5fd0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
5fe0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
5ff0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6000: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6010: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6020: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6030: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6040: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6050: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
6060: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
6070: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
6080: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6090: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
60a0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
60b0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
60c0: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
60d0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
60e0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
60f0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6100: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6110: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6120: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6130: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6140: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6150: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
6160: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
6170: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
6180: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6190: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
61a0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
61b0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
61c0: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
61d0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
61e0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
61f0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6200: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6210: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6220: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6230: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6240: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6250: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
6260: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
6270: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
6280: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6290: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
62a0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
62b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
62c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
62d0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
62e0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
62f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6300: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6330: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6340: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
6350: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
6360: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
6370: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
6380: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
6390: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
63a0: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
63b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
63c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
63d0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
63e0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
63f0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
6400: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
6410: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
6420: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
6430: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
6440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6450: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
6460: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
6470: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6480: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
6490: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
64a0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
64b0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
64c0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
64d0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
64e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
64f0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
6500: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
6510: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
6520: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
6530: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6540: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
6550: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
6560: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
6570: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
6580: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
6590: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
65a0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
65b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
65c0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
65d0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
65e0: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
65f0: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
6600: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
6610: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
6620: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
6630: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
6640: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
6650: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
6660: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
6670: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
6680: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
6690: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
66a0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
66b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66d0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
66e0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
66f0: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
6700: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
6710: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
6720: 70 61 63 65 5b 33 38 34 5d 3b 20 20 20 20 20 20  pace[384];      
6730: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
6740: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
6750: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
6760: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
6770: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
6780: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6790: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
67a0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
67b0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
67c0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
67d0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
67e0: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
67f0: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6800: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6810: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6820: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
6830: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
6840: 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  BKPT;.    sqlite
6850: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6860: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6870: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6880: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
6890: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
68a0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
68b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
68c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
68d0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
68e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
68f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6900: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6910: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6920: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6930: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6940: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6950: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6960: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6980: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6990: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
69a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
69b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69c0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69d0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
69e0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
69f0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6a00: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6a10: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a20: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a30: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a40: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a50: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a60: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6a80: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6a90: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6aa0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6ab0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6ac0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6ad0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b00: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6b10: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b30: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b40: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b50: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b60: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6b80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6b90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6ba0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6bb0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6bc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6be0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6bf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6c00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6c10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c30: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c50: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c60: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c70: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6c80: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6c90: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6ca0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6cb0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6cc0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cd0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6ce0: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6cf0: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6d00: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6d10: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d20: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d40: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d70: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6d80: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6d90: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6da0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6db0: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6dc0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6dd0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6de0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6df0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6e00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6e10: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e20: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e30: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e40: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e50: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e60: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e70: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6e80: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6e90: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6ea0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6eb0: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ec0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6ed0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6ee0: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6ef0: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6f00: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6f10: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f20: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f30: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f40: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f50: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f60: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f70: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6f80: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6f90: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6fa0: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6fb0: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fc0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6fd0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6fe0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
6ff0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7000: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
7010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7020: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7030: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7040: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
7050: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
7060: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
7070: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7080: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
7090: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
70a0: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
70b0: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
70c0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
70d0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
70e0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
70f0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
7100: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
7110: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
7120: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
7130: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
7140: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
7150: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
7160: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
7170: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
7180: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
7190: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
71a0: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
71b0: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
71c0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
71d0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
71e0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
71f0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
7200: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
7210: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
7220: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7230: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
7240: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
7250: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
7260: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7270: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
7280: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
7290: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
72a0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
72b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
72c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
72d0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
72e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72f0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7300: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
7310: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7320: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
7330: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
7340: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
7360: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
7370: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
7380: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44  VALID ){.    *pD
7390: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
73a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
73b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
73c0: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Next==0 );.    *
73d0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
73e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7400: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7410: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7420: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7430: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7440: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7450: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7460: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7470: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7480: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7490: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
74a0: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
74b0: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
74c0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
74d0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
74e0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
74f0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7510: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7520: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7530: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7540: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7550: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7560: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7570: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7580: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7590: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
75a0: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
75b0: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
75c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
75d0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
75e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
75f0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7600: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7610: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7620: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7630: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7640: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7660: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7670: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7680: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7690: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
76a0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
76b0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
76c0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
76d0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
76e0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
76f0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7700: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7710: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7720: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7730: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7740: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7750: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7760: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7770: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7780: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
7790: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
77a0: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
77b0: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
77c0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
77d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
77e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
77f0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7800: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
7810: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
7820: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7830: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7840: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
7850: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7860: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
7870: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
7880: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
7890: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
78a0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
78b0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
78c0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
78d0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
78e0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
78f0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
7900: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
7910: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7920: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
7930: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7940: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7950: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
7960: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
7970: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7980: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
7990: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
79a0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
79b0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
79c0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
79d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
79e0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
79f0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
7a00: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
7a10: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
7a20: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
7a30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
7a40: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
7a50: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
7a60: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
7a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7a80: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
7a90: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7aa0: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
7ab0: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
7ac0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
7ad0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7ae0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7af0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7b00: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7b10: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7b20: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7b30: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7b40: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7b50: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7b60: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7b70: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7b80: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7b90: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7ba0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7bb0: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
7bc0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
7bd0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
7be0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7bf0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7c00: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
7c10: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c20: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7c30: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7c40: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7c50: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7c60: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7c70: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7c80: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7c90: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7ca0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7cb0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7cc0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7cd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7ce0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7cf0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7d00: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7d10: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7d20: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7d30: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7d40: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
7d50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
7d70: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
7d80: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
7d90: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7da0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
7db0: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
7dc0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7dd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7de0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
7df0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
7e00: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7e10: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7e20: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
7e30: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7e40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7e50: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
7e60: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
7e70: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
7e80: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7e90: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
7ea0: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
7eb0: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
7ec0: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
7ed0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
7ee0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
7ef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7f00: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
7f10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f30: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7f40: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
7f50: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
7f60: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
7f70: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
7f80: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
7f90: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7fa0: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
7fb0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
7fc0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
7fd0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7fe0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
7ff0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
8000: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
8010: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8020: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8030: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8040: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8050: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8060: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8070: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8080: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8090: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
80a0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
80b0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
80c0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
80d0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
80e0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
80f0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
8100: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
8110: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8120: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8130: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
8140: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8150: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
8160: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8170: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8180: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
8190: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
81b0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
81c0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
81d0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
81e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8200: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
8210: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
8220: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
8230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8240: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
8250: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8260: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
8270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8280: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
8290: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
82a0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
82b0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
82c0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82d0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
82e0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
82f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8300: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8310: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8320: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8330: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8340: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8350: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8360: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8370: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8380: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
8390: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
83a0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
83b0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
83c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
83d0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
83e0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
83f0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
8400: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
8410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8420: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
8430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8440: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8450: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8460: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8470: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8480: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
8490: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
84a0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
84b0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
84c0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
84d0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
84e0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
84f0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
8500: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
8510: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
8520: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
8530: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8540: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8550: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8560: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8570: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8580: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
8590: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
85a0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
85b0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
85c0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
85d0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
85e0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
85f0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
8600: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
8610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8620: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
8630: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8640: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8650: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8660: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8670: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8680: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
8690: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
86a0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
86b0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
86c0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
86d0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
86e0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
86f0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8700: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8710: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8720: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
8730: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8740: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8750: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8760: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8770: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8780: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
8790: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
87a0: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
87b0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
87c0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
87d0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
87e0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
87f0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
8800: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
8810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8820: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8840: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8850: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8860: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8870: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8880: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8890: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
88a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
88b0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
88c0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
88d0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
88e0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
88f0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8900: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
8910: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8920: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8930: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8940: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8950: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8960: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8970: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8980: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8990: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
89a0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
89b0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
89c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
89d0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
89e0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
89f0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8a00: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8a10: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8a20: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8a30: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8a40: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8a50: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8a60: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8a70: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8a80: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8a90: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
8aa0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
8ab0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
8ac0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
8ad0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8ae0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8af0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8b00: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8b10: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8b20: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8b30: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8b50: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8b60: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8b70: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8b80: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
8b90: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8ba0: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
8bb0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8bc0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
8bd0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
8be0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8bf0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8c00: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8c10: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8c20: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8c30: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8c40: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8c50: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8c60: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8c70: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8c80: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8c90: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8ca0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8cb0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8cc0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8cd0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
8ce0: 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64  &pInfo->pPayload
8cf0: 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20  [pInfo->nLocal] 
8d00: 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a  - pCell) + 4;.}.
8d10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8d20: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8d30: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8d40: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8d50: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8d60: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8d70: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8d80: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8d90: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8da0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8db0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8dc0: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
8dd0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8de0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
8df0: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
8e00: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
8e10: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
8e20: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
8e30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8e40: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
8e50: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
8e60: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
8e70: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
8e80: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
8e90: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
8ea0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
8eb0: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
8ec0: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
8ed0: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
8ee0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
8ef0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
8f00: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8f10: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
8f20: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
8f30: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8f40: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8f50: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8f60: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8f80: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8f90: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8fa0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8fb0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8fc0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8fd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
8fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8ff0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9000: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9010: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
9020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9030: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
9040: 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =4 );.#ifndef SQ
9050: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9060: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
9070: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  age);.#endif.  p
9080: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
9090: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
90a0: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
90b0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
90c0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
90d0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
90e0: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
90f0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >pPayload = 0;. 
9100: 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69   return;.}.stati
9110: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
9120: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
9130: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9140: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9150: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9160: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9190: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
91a0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
91b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
91c0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
91d0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
91e0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
91f0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9200: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9210: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9220: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9230: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9240: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9250: 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20  /.  u64 iKey;   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9270: 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c  xtracted Key val
9280: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
9290: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
92a0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
92b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
92c0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
92d0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
92e0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
92f0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
9300: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
9310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9320: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
9330: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
9340: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9350: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9360: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9370: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9380: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
9390: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
93a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
93b0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
93c0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
93d0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
93e0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
93f0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9400: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9410: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9420: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9430: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9440: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9450: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9460: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9470: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9480: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
9490: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
94a0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
94b0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
94c0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
94d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
94e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
94f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9500: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
9510: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
9520: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9530: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9540: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9550: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
9560: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9570: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
9580: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9590: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
95a0: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
95b0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
95c0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
95d0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
95e0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
95f0: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
9600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
9610: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
9620: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
9630: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
9640: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
9650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9660: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9670: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9680: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
9690: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
96a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
96b0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96c0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
96d0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
96e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
96f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9700: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9710: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9720: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9730: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9740: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9750: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9760: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9770: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9780: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9790: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
97a0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
97b0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
97c0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
97d0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
97e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
97f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9800: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9810: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9820: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9830: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9850: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9860: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9870: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9880: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9890: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
98a0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
98b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
98c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
98d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
98e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
98f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9900: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9910: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9920: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9930: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9940: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9950: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9960: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
9970: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
9980: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
9990: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
99a0: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
99b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
99c0: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
99d0: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
99e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
99f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9a00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9a10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9a20: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9a30: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9a40: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9a50: 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70  eyLeaf==0 );.  p
9a60: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a70: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a80: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9a90: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9aa0: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9ab0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9ac0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ad0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9ae0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9af0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9b00: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9b10: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9b20: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9b30: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9b40: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9b50: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9b60: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9b70: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9b80: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9b90: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9ba0: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9bb0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9bc0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9bd0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9be0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9bf0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9c00: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9c10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9c20: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9c30: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9c40: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9c50: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9c60: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9c70: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9c80: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9c90: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9ca0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9cb0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9cc0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9cd0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9ce0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9d00: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9d10: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9d20: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9d30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9d40: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9d50: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9d60: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9d70: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9d80: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9d90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9da0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9db0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9dc0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9de0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
9df0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
9e00: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
9e10: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9e20: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9e30: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9e40: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
9e50: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
9e60: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9e70: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9e80: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9e90: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9eb0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
9ec0: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
9ed0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
9ee0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
9ef0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
9f00: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
9f10: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9f20: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
9f30: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
9f40: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
9f50: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
9f60: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
9f70: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
9f80: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
9f90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
9fa0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
9fb0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
9fc0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
9fd0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
9fe0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
9ff0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
a000: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a010: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a020: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a030: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a040: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a050: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a060: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a070: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a080: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a090: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a0a0: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a0b0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0c0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0d0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a100: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a110: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a150: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a170: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a180: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a190: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a1a0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a1b0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a1c0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a1d0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a1e0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a1f0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a200: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a210: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a220: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a230: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a240: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a250: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a260: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a270: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a280: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a290: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a2a0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a2b0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a2c0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a2d0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
a2e0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
a2f0: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
a300: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a310: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a320: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a330: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a340: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a350: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a360: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a370: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a380: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a390: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a3a0: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a3b0: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a3c0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a3d0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a3e0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a3f0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a400: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a410: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a420: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a430: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a440: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a450: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a460: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a470: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a480: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a490: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a4a0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a4b0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a4d0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a4e0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a4f0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a500: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a510: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a520: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a530: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a540: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a550: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a560: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a570: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a590: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a5a0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a5b0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a5c0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a5d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a5e0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a5f0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a600: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a610: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a620: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a630: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a640: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a650: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a660: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a670: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a680: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a690: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a6a0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a6b0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a6c0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a6d0: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a6e0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a6f0: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a700: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a710: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a720: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a730: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a740: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a750: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a770: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a780: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a790: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a7a0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a7c0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a7d0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a7e0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a7f0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a800: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a810: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a820: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a830: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a840: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a850: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a860: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a870: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a880: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a890: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a8a0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a8b0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a8c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a8d0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a8e0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a8f0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
a900: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
a910: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a920: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a930: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
a940: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
a950: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
a960: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a970: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
a980: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
a990: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
a9a0: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
a9b0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
a9c0: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
a9d0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
a9e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a9f0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
aa00: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
aa10: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
aa20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
aa30: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
aa40: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
aa50: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
aa60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
aa70: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
aa80: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
aa90: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
aaa0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
aab0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
aac0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aad0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
aae0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
aaf0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
ab00: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
ab10: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
ab20: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
ab30: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
ab40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
ab50: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
ab60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
ab70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab80: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
ab90: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
aba0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
abb0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
abc0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
abd0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
abe0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
abf0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
ac00: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac10: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ac20: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
ac30: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
ac40: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
ac50: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
ac60: 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b  [info.nSize-4]);
ac70: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
ac80: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
ac90: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
aca0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
acb0: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
acc0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
acd0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
ace0: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
acf0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
ad00: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
ad10: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
ad20: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
ad30: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
ad40: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
ad50: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
ad60: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
ad70: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
ad80: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
ad90: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ada0: 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ea..**.** EVIDEN
adb0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
adc0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
add0: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
ade0: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
adf0: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
ae00: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
ae10: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
ae20: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
ae30: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
ae40: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
ae50: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
ae60: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
ae70: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
ae80: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
ae90: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
aea0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
aec0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
aed0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
aee0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
aef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
af00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
af10: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
af20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
af30: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
af40: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
af50: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
af60: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af70: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
af80: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
af90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
afa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
afb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
afc0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
afd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
afe0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
aff0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
b000: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
b010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b020: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b030: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
b040: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b060: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b070: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b080: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
b0b0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
b0c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b0d0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
b0e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
b0f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b100: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
b110: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
b120: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
b130: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b140: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
b150: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
b160: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
b170: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
b180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
b190: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
b1a0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
b1b0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
b1c0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
b1d0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b1e0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
b1f0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
b200: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
b210: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b220: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
b230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b240: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b250: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
b260: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
b270: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b280: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
b290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b2a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b2b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b2c0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20  );.  temp = 0;. 
b2d0: 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50   src = data = pP
b2e0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
b2f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b300: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
b310: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
b320: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
b330: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
b340: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
b350: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
b360: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
b370: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
b380: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b390: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
b3a0: 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69  eSize;.  iCellFi
b3b0: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b3c0: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43   + 2*nCell;.  iC
b3d0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b3e0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28  Size - 4;.  for(
b3f0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
b400: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
b410: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
b420: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
b430: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
b440: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
b450: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
b460: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
b470: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b480: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b4a0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
b4b0: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f  .    /* These co
b4c0: 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  nditions have al
b4d0: 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66  ready been verif
b4e0: 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74  ied in btreeInit
b4f0: 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66  Page().    ** if
b500: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
b510: 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20  e_check=ON..    
b520: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
b530: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
b540: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
b550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b560: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b570: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
b580: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
b590: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
b5a0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
b5b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
b5c0: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
b5d0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
b5e0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
b5f0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
b600: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
b610: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b620: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b630: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b640: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
b650: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
b660: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
b670: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
b680: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
b690: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
b6a0: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
b6b0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
b6c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
b6d0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20  ddr, cbrk);.    
b6e0: 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20  if( temp==0 ){. 
b6f0: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
b700: 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29    if( cbrk==pc )
b710: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b720: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
b730: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
b740: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
b750: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  );.      x = get
b760: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b770: 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  5]);.      memcp
b780: 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74  y(&temp[x], &dat
b790: 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65  a[x], (cbrk+size
b7a0: 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72  ) - x);.      sr
b7b0: 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a  c = temp;.    }.
b7c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b7d0: 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d  [cbrk], &src[pc]
b7e0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61  , size);.  }.  a
b7f0: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65  ssert( cbrk>=iCe
b800: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74  llFirst );.  put
b810: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b820: 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74  5], cbrk);.  dat
b830: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
b840: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
b850: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
b860: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
b870: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
b880: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
b890: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
b8a0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
b8b0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b8c0: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
b8d0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
b8e0: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
b8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
b920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b930: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
b940: 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70  e-list on page p
b950: 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20  Pg for space to 
b960: 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79  store a cell nBy
b970: 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73  te bytes in.** s
b980: 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20  ize. If one can 
b990: 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
b9a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b9b0: 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f  e space and remo
b9c0: 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  ve it.** from th
b9d0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
b9e0: 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
b9f0: 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66  e space can be f
ba00: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65  ound on the free
ba10: 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55  -list, return NU
ba20: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  LL..**.** This f
ba30: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65  unction may dete
ba40: 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  ct corruption wi
ba50: 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f  thin pPg.  If co
ba60: 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64  rruption is.** d
ba70: 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52  etected then *pR
ba80: 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  c is set to SQLI
ba90: 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e  TE_CORRUPT and N
baa0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bab0: 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20  .**.** Slots on 
bac0: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68  the free list th
bad0: 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31  at are between 1
bae0: 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72   and 3 bytes lar
baf0: 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a  ger than nByte.*
bb00: 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  * will be ignore
bb10: 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20  d if adding the 
bb20: 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74  extra space to t
bb30: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
bb40: 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73   count.** causes
bb50: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69   the fragmentati
bb60: 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65  on count to exce
bb70: 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  ed 60..*/.static
bb80: 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f   u8 *pageFindSlo
bb90: 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20  t(MemPage *pPg, 
bba0: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
bbb0: 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  pRc){.  const in
bbc0: 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
bbd0: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63  Offset;.  u8 * c
bbe0: 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
bbf0: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->aData;.  int i
bc00: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  Addr = hdr + 1;.
bc10: 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62    int pc = get2b
bc20: 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72  yte(&aData[iAddr
bc30: 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69  ]);.  int x;.  i
bc40: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
bc50: 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
bc60: 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
bc70: 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20   pc>0 );.  do{. 
bc80: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
bc90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bca0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
bcb0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   */.    /* EVIDE
bcc0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d  NCE-OF: R-06866-
bcd0: 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73  39125 Freeblocks
bce0: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e   are always conn
bcf0: 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f  ected in order o
bd00: 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73  f.    ** increas
bd10: 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20  ing offset. */. 
bd20: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
bd30: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64  Size-4 || pc<iAd
bd40: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70  dr+4 ){.      *p
bd50: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
bd60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bd80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bd90: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
bda0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
bdb0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
bdc0: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
bdd0: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
bde0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
bdf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
be00: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
be10: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
be20: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
be30: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
be40: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
be50: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
be60: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
be70: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
be80: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
be90: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
bea0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
beb0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
bec0: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
bed0: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
bee0: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
bef0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
bf00: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
bf10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bf20: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
bf30: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
bf40: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
bf50: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bf60: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
bf70: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
bf80: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
bf90: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
bfa0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
bfb0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
bfc0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
bfd0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
bfe0: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
bff0: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
c000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
c010: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
c020: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
c030: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
c040: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
c050: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
c060: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c070: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
c080: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
c090: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
c0a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
c0b0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
c0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c0d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
c0e0: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
c0f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
c100: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
c110: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
c120: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
c130: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
c140: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
c150: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
c160: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
c170: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
c180: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
c190: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
c1a0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
c1b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c1c0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
c1d0: 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a    }while( pc );.
c1e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c1f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
c200: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
c210: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
c220: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
c230: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
c240: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
c250: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
c260: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
c270: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
c280: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
c290: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
c2a0: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
c2b0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
c2c0: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
c2d0: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
c2e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
c2f0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
c300: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
c310: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
c320: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
c330: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
c340: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
c350: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
c360: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
c370: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
c380: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
c390: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
c3a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c3b0: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
c3c0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
c3d0: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
c3e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
c3f0: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
c400: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
c410: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
c420: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
c430: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
c440: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
c450: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
c460: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
c470: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
c480: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
c490: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
c4a0: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
c4b0: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
c4c0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c4d0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c4e0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
c4f0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
c500: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
c510: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
c520: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
c530: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c540: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
c550: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c580: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
c590: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
c5a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5b0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c5c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
c5d0: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
c5e0: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
c5f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c600: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
c610: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
c620: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
c630: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
c640: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c650: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c660: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
c670: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
c680: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c690: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c6a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c6b0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
c6c0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
c6d0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
c6e0: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
c6f0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
c700: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
c710: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
c720: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
c730: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
c740: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
c750: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
c760: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c770: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
c780: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
c790: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
c7a0: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
c7b0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
c7c0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
c7d0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
c7e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
c7f0: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
c800: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
c810: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
c820: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
c830: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
c840: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
c850: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
c860: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
c870: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
c880: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
c890: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
c8a0: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
c8b0: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
c8c0: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
c8d0: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
c8e0: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
c8f0: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
c900: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
c910: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
c920: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
c930: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
c940: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
c950: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
c960: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
c970: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c980: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
c990: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
c9a0: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
c9b0: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
c9c0: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
c9d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c9e0: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
c9f0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
ca00: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
ca10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ca30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ca40: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
ca50: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
ca60: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
ca70: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
ca80: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
ca90: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
caa0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
cab0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
cac0: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
cad0: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
cae0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
caf0: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
cb00: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
cb10: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
cb20: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cb30: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
cb40: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
cb50: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
cb60: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
cb70: 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c  ( (data[hdr+2] |
cb80: 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26  | data[hdr+1]) &
cb90: 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  & gap+2<=top ){.
cba0: 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
cbb0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
cbc0: 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  age, nByte, &rc)
cbd0: 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65  ;.    if( pSpace
cbe0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cbf0: 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26  ( pSpace>=data &
cc00: 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  & (pSpace - data
cc10: 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
cc20: 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70   *pIdx = (int)(p
cc30: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20  Space - data);. 
cc40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cc50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
cc60: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cc70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cc80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
cc90: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
cca0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
ccb0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
ccc0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
ccd0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
cce0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
ccf0: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
cd00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
cd10: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
cd20: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
cd30: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >top ){.    asse
cd40: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
cd50: 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  >0 || CORRUPT_DB
cd60: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
cd70: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
cd80: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
cd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cda0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
cdb0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
cdc0: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
cdd0: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
cde0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
cdf0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
ce00: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
ce10: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
ce20: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ce30: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ce40: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ce50: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ce60: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ce70: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
ce80: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
ce90: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
cea0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
ceb0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
cec0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
ced0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
cee0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
cef0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
cf00: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
cf10: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
cf20: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
cf30: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
cf40: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
cf50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cf60: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
cf70: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
cf80: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
cf90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cfa0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
cfb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cfc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
cfd0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
cfe0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
cff0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
d000: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
d010: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
d020: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
d030: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
d040: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
d050: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
d060: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
d070: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
d080: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
d090: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
d0a0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
d0b0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
d0c0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
d0d0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
d0e0: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
d0f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
d100: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
d110: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
d120: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
d130: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
d140: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
d150: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
d160: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
d170: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
d180: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
d190: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
d1a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
d1b0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
d1c0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
d1d0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d1f0: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
d200: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
d210: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
d220: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
d230: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
d240: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
d250: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d280: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
d290: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
d2a0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
d2d0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
d2e0: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d310: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
d320: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
d330: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
d360: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
d370: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
d380: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
d3b0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
d3c0: 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67  u32 iLast = pPag
d3d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d3e0: 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74  ze-4; /* Largest
d3f0: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
d400: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
d410: 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
d420: 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
d430: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
d440: 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
d450: 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
d460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
d470: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d480: 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
d490: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
d4a0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
d4b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
d4c0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d4d0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d4e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d4f0: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
d500: 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
d510: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
d520: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
d540: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
d550: 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
d560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d580: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d590: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
d5b0: 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
d5c0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d5d0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d5e0: 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b  iStart<=iLast );
d5f0: 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  ..  /* Overwrite
d600: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
d610: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
d620: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
d630: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69  delete.  ** opti
d640: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
d650: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
d660: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
d670: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
d680: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
d690: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
d6a0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
d6b0: 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
d6c0: 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
d6d0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
d6e0: 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
d6f0: 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
d700: 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
d710: 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
d720: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
d730: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d740: 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
d750: 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
d760: 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
d770: 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
d780: 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
d790: 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
d7a0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
d7b0: 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
d7c0: 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
d7d0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
d7e0: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
d7f0: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
d800: 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  ))<iStart ){.   
d810: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
d820: 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  iPtr+4 ){.      
d830: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d    if( iFreeBlk==
d840: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
d850: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d860: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74       }.      iPt
d880: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
d890: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
d8a0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
d8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
d8d0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
d8e0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
d8f0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
d900: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
d910: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
d920: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
d930: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
d940: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
d950: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
d960: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
d970: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
d980: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
d990: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
d9a0: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
d9b0: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
d9c0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d9d0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
d9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d9f0: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
da00: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
da10: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
da20: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
da30: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
da40: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
da50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
da60: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
da70: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
da80: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
da90: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
daa0: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
dab0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
dac0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dad0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dae0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
daf0: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
db00: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
db10: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
db20: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
db30: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
db40: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
db50: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
db60: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
db70: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
db80: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
db90: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
dba0: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
dbb0: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
dbc0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
dbd0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
dbe0: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
dbf0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
dc00: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
dc10: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
dc20: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
dc30: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
dc40: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
dc50: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
dc60: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
dc70: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
dc80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
dc90: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
dca0: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
dcb0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
dcc0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
dcd0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
dce0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
dcf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
dd00: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
dd10: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
dd20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dd30: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
dd40: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
dd50: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
dd60: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dd70: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
dd80: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
dd90: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
dda0: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
ddb0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
ddc0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
ddd0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
dde0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
ddf0: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
de00: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
de10: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
de20: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
de30: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
de40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
de50: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
de60: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
de70: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
de80: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
de90: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
dea0: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
deb0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
dec0: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
ded0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
dee0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
def0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
df00: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
df10: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
df20: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
df30: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
df40: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
df50: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
df60: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
df70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
df80: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
df90: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
dfa0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
dfb0: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
dfc0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
dfd0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
dfe0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
dff0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
e000: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
e010: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
e020: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
e030: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
e040: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
e050: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
e060: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
e070: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
e080: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
e090: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
e0a0: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
e0b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e0c0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
e0d0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
e0e0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
e0f0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
e100: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
e110: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
e120: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e130: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
e140: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
e150: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
e160: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
e170: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e180: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
e190: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
e1a0: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
e1b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e1c0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e1d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
e1e0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
e1f0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
e200: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
e210: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
e220: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
e230: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
e240: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
e250: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
e260: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e270: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
e280: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
e290: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
e2a0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
e2b0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
e2c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e2d0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d  NCE-OF: R-07291-
e2e0: 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66  35328 A value of
e2f0: 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20   5 (0x05) means 
e300: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
e310: 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74     ** interior t
e320: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e330: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e340: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e350: 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b  TF_INTKEY)==5 );
e360: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e370: 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31  -OF: R-26900-091
e380: 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33  76 A value of 13
e390: 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68   (0x0d) means th
e3a0: 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
e3b0: 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d  ** leaf table b-
e3c0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e3d0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
e3e0: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
e3f0: 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
e400: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
e410: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
e420: 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
e430: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
e440: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
e450: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e460: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e470: 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
e480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
e490: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
e4a0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
e4b0: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
e4c0: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
e4d0: 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  d;.      pPage->
e4e0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e4f0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
e500: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20  Payload;.    }. 
e510: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
e520: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
e530: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
e540: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
e550: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
e560: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
e570: 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
e580: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e590: 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41   R-43316-37308 A
e5a0: 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30   value of 2 (0x0
e5b0: 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  2) means the pag
e5c0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
e5d0: 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d  nterior index b-
e5e0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e5f0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e600: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e610: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e620: 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38  F: R-59615-42828
e630: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28   A value of 10 (
e640: 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0a) means the 
e650: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
e660: 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72   leaf index b-tr
e670: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
e680: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
e690: 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
e6a0: 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
e6b0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
e6c0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
e6d0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
e6e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e6f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e700: 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
e710: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
e720: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
e730: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
e740: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
e750: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
e760: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e770: 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
e780: 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
e790: 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
e7a0: 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
e7b0: 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
e7c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e7d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e7e0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
e7f0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
e800: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
e810: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
e820: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e830: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
e840: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
e850: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
e860: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
e870: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
e880: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
e890: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
e8a0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
e8b0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
e8c0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
e8d0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
e8e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
e8f0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
e900: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
e910: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
e920: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
e930: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
e940: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
e950: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
e960: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
e970: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
e980: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
e990: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
e9a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
e9b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
e9c0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
e9d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
e9e0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
e9f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ea00: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ea10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ea20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ea30: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
ea40: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
ea50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ea60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
ea70: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
ea80: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
ea90: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
eaa0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
eab0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
eac0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
ead0: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
eae0: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
eaf0: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
eb10: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
eb20: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
eb30: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
eb40: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
eb50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
eb60: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
eb70: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
eb80: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
eb90: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
eba0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
ebb0: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
ebc0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
ebd0: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
ebe0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
ebf0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
ec00: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
ec10: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
ec20: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
ec30: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
ec40: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
ec50: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
ec60: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
ec70: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
ec80: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
ec90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
eca0: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
ecb0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
ecc0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ecd0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ece0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ecf0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
ed00: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
ed10: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
ed20: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ed30: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ed40: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
ed50: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
ed60: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
ed70: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed80: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
ed90: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
eda0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
edb0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
edc0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
edd0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
ede0: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
edf0: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
ee00: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
ee10: 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
ee20: 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
ee30: 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
ee40: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
ee50: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
ee60: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
ee70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ee80: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
ee90: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
eea0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
eeb0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
eec0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
eed0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
eee0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
eef0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ef00: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
ef10: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
ef20: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ef30: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
ef40: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
ef50: 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
ef60: 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
ef70: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
ef80: 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
ef90: 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
efa0: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
efb0: 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
efc0: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
efd0: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
efe0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
eff0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f000: 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
f010: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f020: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f030: 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
f040: 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
f050: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f060: 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
f070: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
f080: 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
f090: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
f0a0: 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
f0b0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
f0c0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
f0d0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f0e0: 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
f0f0: 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
f100: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f110: 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
f120: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
f130: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
f140: 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
f150: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
f160: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
f170: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f180: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
f190: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
f1a0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
f1b0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
f1c0: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
f1d0: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
f1e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f1f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f200: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
f210: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
f220: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
f230: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f240: 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
f250: 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
f260: 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
f270: 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
f280: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
f290: 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
f2a0: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
f2b0: 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
f2c0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
f2d0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
f2e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f2f0: 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
f300: 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
f310: 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
f320: 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
f330: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f340: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
f350: 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
f360: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
f370: 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
f380: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
f390: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
f3a0: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
f3b0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
f3c0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
f3d0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
f3e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f3f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
f400: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
f410: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
f420: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
f430: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
f440: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
f450: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
f460: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
f470: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
f480: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
f490: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
f4a0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
f4b0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
f4c0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
f4d0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
f4e0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
f4f0: 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
f500: 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
f510: 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
f520: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f530: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
f540: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
f550: 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
f560: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
f570: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
f580: 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
f590: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f5a0: 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
f5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
f5c0: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
f5d0: 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
f5e0: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
f5f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
f600: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
f610: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f620: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
f630: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f640: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
f650: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
f660: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
f670: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
f680: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f690: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f6a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f6b0: 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
f6c0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
f6d0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
f6e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
f6f0: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
f700: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
f710: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
f720: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
f730: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f740: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
f750: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f760: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f770: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
f780: 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
f790: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
f7a0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
f7b0: 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
f7c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
f7d0: 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
f7e0: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
f7f0: 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
f800: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
f810: 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
f820: 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
f830: 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
f840: 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
f850: 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
f860: 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
f870: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
f880: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
f890: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
f8a0: 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
f8b0: 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
f8c0: 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
f8d0: 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
f8e0: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
f8f0: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
f900: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
f910: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
f920: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
f930: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f940: 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
f950: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
f960: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
f970: 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
f980: 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
f990: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
f9a0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
f9b0: 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
f9c0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
f9d0: 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c  * Or, the freebl
f9e0: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65  ock is off the e
f9f0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  nd of the page. 
fa00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fa10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
fa40: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
fa50: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
fa60: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fa70: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
fa80: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
fa90: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
faa0: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
fab0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
fac0: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
fad0: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
fae0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
faf0: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
fb00: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
fb10: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
fb20: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
fb30: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
fb40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fb50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fb60: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
fb70: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
fb80: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
fb90: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
fba0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
fbb0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
fbc0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
fbd0: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
fbe0: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
fbf0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
fc00: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
fc10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
fc20: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
fc30: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
fc40: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
fc50: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
fc60: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
fc70: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
fc80: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
fc90: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
fca0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
fcb0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
fcc0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
fcd0: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
fce0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
fcf0: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fd00: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
fd10: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
fd20: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
fd30: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
fd40: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
fd50: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
fd60: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
fd70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fd80: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
fd90: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
fda0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
fdb0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
fdc0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
fdd0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
fde0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fdf0: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
fe00: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
fe10: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
fe20: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
fe30: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
fe40: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
fe50: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
fe60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
fe70: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
fe80: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
fe90: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
fea0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
feb0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
fec0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
fed0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
fee0: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
fef0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
ff00: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
ff10: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
ff20: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
ff30: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
ff40: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
ff50: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
ff60: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
ff70: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
ff80: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
ff90: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
ffa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ffb0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ffc0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ffd0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
ffe0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
fff0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10000 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10010 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
10020 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
10030 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
10040 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
10050 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
10060 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
10070 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
10080 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
10090 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
100a0 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
100b0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
100c0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
100d0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
100e0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
100f0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
10100 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
10110 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
10120 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
10130 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
10140 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
10150 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
10160 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
10170 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
10180 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
10190 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
101a0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
101b0 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
101c0 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
101d0 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
101e0 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
101f0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
10200 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
10210 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
10220 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
10230 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
10240 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
10250 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
10260 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
10270 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
10280 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
10290 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
102a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
102b0 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
102c0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
102d0 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
102e0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
102f0 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
10300 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
10310 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
10320 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
10330 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
10340 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10350 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
10360 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
10370 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
10380 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
10390 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67   pgno!=pPage->pg
103a0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  no ){.    pPage-
103b0 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
103c0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
103d0 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Page);.    pPage
103e0 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
103f0 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  age;.    pPage->
10400 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70  pBt = pBt;.    p
10410 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
10420 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64  o;.    pPage->hd
10430 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d  rOffset = pgno==
10440 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d  1 ? 100 : 0;.  }
10450 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10460 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
10470 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
10480 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
10490 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
104a0 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
104b0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
104c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
104d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
104e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
104f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10500 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
10510 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10520 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
10530 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
10540 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
10550 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
10560 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
10570 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
10580 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
10590 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
105a0 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
105b0 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
105c0 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
105d0 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
105e0 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
105f0 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
10600 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
10610 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
10620 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
10630 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
10640 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
10650 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
10660 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
10670 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
10680 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
10690 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
106a0 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
106b0 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
106c0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
106d0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
106e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
106f0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10710 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
10720 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
10730 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
10740 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
10750 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
10760 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
10770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10780 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10790 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
107a0 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
107b0 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
107c0 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
107d0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
107e0 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
107f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
10800 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10810 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
10820 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10830 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10840 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
10850 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10860 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10870 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10880 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
10890 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
108a0 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
108b0 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
108c0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
108d0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
108e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
108f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
10900 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10910 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
10920 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
10930 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
10940 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
10950 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
10960 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
10970 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
10980 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
10990 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
109a0 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
109b0 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
109c0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
109d0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
109e0 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
109f0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
10a00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10a10 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10a20 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
10a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
10a40 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
10a50 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
10a60 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
10a70 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
10a80 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10a90 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10ab0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10ac0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
10ad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
10ae0 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
10af0 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
10b00 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
10b10 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
10b20 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
10b30 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
10b40 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
10b50 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
10b60 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
10b70 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
10b80 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
10b90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
10ba0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
10bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
10bc0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
10bd0 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
10be0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10bf0 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
10c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10c10 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
10c20 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
10c30 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ze it..**.** If 
10c40 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65  pCur!=0 then the
10c50 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66   page is being f
10c60 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f  etched as part o
10c70 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  f a moveToChild(
10c80 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61  ).** call.  Do a
10c90 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
10ca0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
10cb0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
10cc0 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68  se..** And if th
10cd0 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74  e fetch fails, t
10ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
10cf0 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d   decrement pCur-
10d00 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  >iPage..**.** Th
10d10 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65  e page is fetche
10d20 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20  d as read-write 
10d30 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e  unless pCur is n
10d40 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a  ot NULL and is.*
10d50 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  * a read-only cu
10d60 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rsor..**.** If a
10d70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10d80 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
10d90 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
10da0 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
10db0 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
10dc0 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
10dd0 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
10de0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
10df0 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
10e00 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
10e30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10e60 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
10e70 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
10e80 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
10e90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
10ea0 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
10eb0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43  er here */.  BtC
10ec0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ee0 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76  Cursor to receiv
10ef0 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e  e the page, or N
10f00 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ULL */.  int bRe
10f10 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
10f20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10f30 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
10f40 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
10f50 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
10f60 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
10f70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10f80 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10f90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
10fa0 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  Cur==0 || ppPage
10fb0 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ==&pCur->apPage[
10fc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
10fd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10fe0 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
10ff0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11000 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11010 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11020 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11030 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11040 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11050 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11060 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11070 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11080 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11090 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
110a0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
110b0 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
110c0 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62  ge**)&pDbPage, b
110d0 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28  ReadOnly);.  if(
110e0 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   rc ){.    goto 
110f0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11100 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  rror;.  }.  *ppP
11110 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11120 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11130 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11140 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
11150 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
11160 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
11170 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
11180 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
11190 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
111a0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
111b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
111c0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
111d0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
111e0 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
111f0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11210 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11220 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
11230 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11240 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  )->aData==sqlite
11250 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11260 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
11270 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63  If obtaining a c
11280 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20  hild page for a 
11290 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20  cursor, we must 
112a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
112b0 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  page is.  ** com
112c0 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
112d0 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20   root page. */. 
112e0 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a   if( pCur && ((*
112f0 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31  ppPage)->nCell<1
11300 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
11310 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72  ntKey!=pCur->cur
11320 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  IntKey) ){.    r
11330 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
11340 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c  PT_BKPT;.    rel
11350 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
11360 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
11370 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11380 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11390 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
113a0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a  dInitPage_error:
113b0 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70 43  .  if( pCur ) pC
113c0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74  ur->iPage--;.  t
113d0 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
113e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
113f0 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
11400 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
11410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11420 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
11430 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
11440 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
11450 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
11460 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
11470 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
11480 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11490 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
114a0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
114b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
114c0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
114d0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
114e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
114f0 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
11500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11510 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11520 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
11530 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
11540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11550 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11560 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
11570 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
11580 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11590 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
115a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
115b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
115c0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
115d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
115e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
115f0 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
11600 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
11610 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
11620 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
11630 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
11640 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
11650 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
11660 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
11670 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
11680 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
11690 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
116a0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
116b0 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
116c0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
116d0 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
116e0 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
116f0 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
11700 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
11710 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
11720 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
11730 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
11740 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11750 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
11760 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
11770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11780 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
11790 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
117a0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
117b0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
117c0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
117d0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
117e0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
117f0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11800 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11810 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11820 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11830 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
11840 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
11850 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
11860 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
11870 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
11880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11890 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
118a0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
118b0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
118c0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
118d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
118e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
118f0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
11900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11910 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11920 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
11930 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
11940 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
11950 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
11960 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11970 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
11980 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
11990 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
119a0 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
119b0 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
119c0 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
119d0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
119e0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
119f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11a00 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
11a10 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
11a20 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
11a30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11a50 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
11a60 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
11a70 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
11a80 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
11a90 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
11aa0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
11ab0 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
11ac0 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
11ad0 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
11ae0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11af0 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
11b00 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
11b10 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
11b20 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
11b30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
11b40 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
11b50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
11b60 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
11b70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11b80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11b90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11ba0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
11bb0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
11bc0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
11bd0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
11be0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
11bf0 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
11c00 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
11c10 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
11c20 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
11c30 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
11c40 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
11c50 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
11c60 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
11c70 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
11c80 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
11c90 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
11ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11cb0 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
11cc0 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
11cd0 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
11ce0 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
11cf0 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
11d00 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
11d10 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
11d20 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
11d30 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
11d40 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
11d50 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
11d60 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
11d70 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
11d80 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
11d90 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
11da0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
11db0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11dc0 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
11dd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11de0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
11df0 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
11e00 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
11e10 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
11e20 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
11e30 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
11e40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11e50 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
11e60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
11e70 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
11e80 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
11e90 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
11ea0 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
11eb0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
11ec0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
11ed0 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
11ee0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
11ef0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
11f00 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
11f10 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
11f20 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
11f30 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
11f40 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11f50 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
11f60 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
11f70 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
11f80 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
11f90 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
11fa0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
11fb0 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
11fc0 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
11fd0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
11fe0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
11ff0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
12000 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
12010 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12020 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
12030 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12040 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
12050 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
12060 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
12070 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
12080 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
12090 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
120a0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
120b0 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
120c0 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
120d0 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
120e0 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
120f0 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
12100 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
12110 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
12120 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
12130 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12140 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
12150 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
12160 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
12170 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
12180 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
12190 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
121a0 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
121b0 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
121c0 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
121d0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
121e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
121f0 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
12200 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
12210 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
12220 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
12230 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
12240 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12250 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
12260 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
12270 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
12280 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
12290 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
122a0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
122b0 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
122c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
122d0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
122e0 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
122f0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
12300 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
12310 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
12320 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
12330 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
12340 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
12350 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12360 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
12370 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
12380 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
12390 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
123a0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
123b0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
123c0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
123d0 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
123e0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
123f0 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
12400 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
12410 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12430 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
12440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
12450 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
12460 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
12470 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
12480 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
12490 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
124a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
124b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
124c0 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
124d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
124e0 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
12500 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
12510 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
12520 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
12530 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
12540 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
12550 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
12560 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
12570 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
12580 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
12590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
125a0 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
125b0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
125c0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
125d0 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
125e0 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
125f0 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
12600 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12610 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
12620 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
12630 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
12640 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
12650 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12660 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
12670 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
12680 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
12690 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
126a0 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
126b0 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
126c0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
126d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
126e0 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
126f0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
12700 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
12710 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
12720 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12730 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
12740 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
12750 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
12760 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
12770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12780 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12790 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
127a0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
127b0 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
127c0 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
127d0 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
127e0 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
127f0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
12800 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
12810 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
12820 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
12830 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
12840 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
12850 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
12860 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
12870 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
12880 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
12890 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
128a0 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
128b0 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
128c0 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
128d0 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
128e0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
128f0 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
12900 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
12910 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
12920 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
12930 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
12940 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
12950 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
12960 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
12970 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
12980 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
12990 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
129a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
129b0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
129c0 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
129d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
129e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
129f0 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
12a00 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
12a10 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
12a20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12a30 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
12a40 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
12a50 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
12a60 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
12a70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12a80 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
12a90 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
12aa0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12ab0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
12ac0 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
12ad0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
12ae0 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
12af0 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
12b00 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
12b10 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
12b20 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
12b30 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
12b40 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
12b50 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
12b60 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
12b70 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
12b80 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
12b90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
12ba0 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
12bb0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
12bc0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
12bd0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
12be0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
12bf0 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
12c00 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
12c10 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
12c20 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
12c30 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
12c40 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
12c50 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
12c60 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
12c70 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
12c80 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
12c90 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
12ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
12cb0 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
12cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12cd0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
12ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12cf0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
12d00 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
12d10 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
12d20 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
12d30 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
12d40 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
12d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
12d70 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
12d80 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   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 6e                 n
12db0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
12dc0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12dd0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
12de0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12df0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
12e00 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
12e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12e20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12e30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12e40 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
12e50 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
12e60 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
12e70 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12e80 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12e90 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
12ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12eb0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
12ec0 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
12ed0 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
12ee0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
12ef0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
12f00 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
12f10 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12f20 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
12f30 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
12f40 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
12f50 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
12f60 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
12f70 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
12f80 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
12f90 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
12fa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
12fb0 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
12fc0 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
12fd0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
12fe0 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13000 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
13010 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
13020 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
13030 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
13040 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
13050 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
13060 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
13070 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
13080 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
13090 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
130a0 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
130b0 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
130c0 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
130d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
130e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
130f0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13100 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13110 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13120 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
13130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13140 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
13150 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
13160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13170 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
13180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13190 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
131a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
131b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
131c0 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
131d0 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
131e0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
131f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
13200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13210 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13220 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
13230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13240 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13250 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
13260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
13270 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
13280 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
13290 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
132a0 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
132b0 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
132c0 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
132d0 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
132e0 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
132f0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
13300 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
13310 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
13320 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
13330 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13340 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
13350 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
13360 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
13370 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
13380 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
13390 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
133a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
133b0 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
133c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
133d0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
133e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
133f0 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
13400 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
13410 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
13420 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
13430 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
13440 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
13450 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
13460 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
13470 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
13480 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
13490 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
134a0 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
134b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
134c0 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
134d0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
134e0 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
134f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13500 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
13510 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
13520 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
13530 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
13540 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
13550 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
13560 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
13570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
13580 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
13590 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
135a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
135b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
135c0 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
135d0 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
135e0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
13600 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
13610 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13620 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13650 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13660 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13670 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13680 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13690 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
136a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
136b0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
136c0 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
136d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
136e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
136f0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13700 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
13710 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
13720 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
13730 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
13740 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
13750 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
13760 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
13770 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
13780 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
13790 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
137a0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
137b0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
137c0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
137d0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
137e0 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
137f0 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
13800 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
13810 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
13820 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
13830 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13840 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
13850 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
13860 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
13870 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
13880 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
13890 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
138a0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
138b0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
138c0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
138d0 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
138e0 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
138f0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
13900 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
13910 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
13920 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
13930 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
13940 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
13950 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
13960 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
13970 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
13980 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
13990 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
139a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
139b0 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
139c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
139d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
139e0 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
139f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13a00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13a10 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
13a20 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
13a30 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
13a40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
13a50 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
13a60 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
13a70 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
13a80 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
13a90 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
13aa0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
13ab0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
13ac0 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
13ad0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
13ae0 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
13af0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
13b00 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
13b10 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
13b20 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
13b30 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
13b40 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
13b50 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
13b60 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
13b70 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
13b80 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
13b90 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
13ba0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
13bb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bc0 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
13bd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
13be0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
13bf0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
13c00 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
13c10 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
13c20 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
13c30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
13c40 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
13c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13c60 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
13c70 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
13c80 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
13c90 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
13ca0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
13cb0 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
13cc0 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
13cd0 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
13ce0 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
13cf0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
13d00 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
13d10 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
13d20 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
13d30 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
13d40 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13d50 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
13d60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13d70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13d80 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
13d90 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
13da0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
13db0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13dc0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
13dd0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
13de0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
13df0 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
13e00 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
13e10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
13e20 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
13e30 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
13e40 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
13e50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
13e60 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
13e70 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
13e80 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
13e90 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
13ea0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
13eb0 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
13ec0 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
13ed0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
13ee0 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
13ef0 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
13f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13f10 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
13f20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13f30 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
13f40 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
13f50 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
13f60 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
13f70 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
13f80 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
13f90 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
13fa0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
13fb0 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
13fc0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
13fd0 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
13fe0 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
13ff0 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14000 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14010 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14020 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14030 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14040 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14050 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
14060 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
14070 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
14080 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
14090 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
140a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
140b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
140c0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
140d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
140e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
140f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14100 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14120 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14130 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14140 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
14150 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
14160 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
14170 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14180 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
14190 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
141a0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
141b0 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
141c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
141d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
141e0 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
141f0 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
14200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14210 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14220 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14230 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14240 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
14250 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
14260 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
14270 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
14280 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
14290 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
142a0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
142b0 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
142c0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
142d0 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
142e0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
142f0 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
14300 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
14310 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14320 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
14330 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
14340 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14360 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
14370 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
14380 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
14390 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
143a0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
143b0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
143c0 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
143d0 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
143e0 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
143f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14400 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14410 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14420 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14430 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14440 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14450 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14460 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
14470 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
14480 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
14490 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
144a0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
144b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
144c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
144d0 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
144e0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
144f0 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
14500 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
14510 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
14520 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
14530 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14550 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
14560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14580 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
14590 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
145a0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
145b0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
145c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
145d0 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
145e0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
145f0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14600 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
14610 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14620 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
14630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
14640 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
14650 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14660 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
14670 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14680 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
14690 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
146a0 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
146b0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
146c0 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
146d0 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
146e0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
146f0 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
14700 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
14710 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
14720 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14730 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
14740 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
14750 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14760 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
14770 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
14780 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
14790 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
147a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
147b0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
147c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
147d0 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
147e0 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
147f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14800 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
14810 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
14820 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
14830 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
14840 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
14850 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
14860 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
14870 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
14880 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
14890 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
148a0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
148b0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
148c0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
148d0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
148e0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
148f0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
14900 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
14910 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
14920 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
14930 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
14940 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
14950 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
14960 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
14970 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
14980 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14990 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
149a0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
149b0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
149c0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
149d0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
149e0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
149f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14a00 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
14a10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
14a20 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
14a30 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
14a40 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14a50 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
14a60 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
14a70 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
14a80 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
14a90 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
14aa0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
14ab0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
14ac0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
14ad0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
14ae0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
14af0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14b00 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14b10 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
14b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14b30 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
14b40 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14b50 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14b60 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
14b70 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
14b80 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
14b90 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
14ba0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
14bb0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
14bc0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
14bd0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
14be0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
14bf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14c00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
14c10 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14c20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14c30 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
14c40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
14c50 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
14c60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
14c70 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
14c80 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
14c90 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
14ca0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
14cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14cc0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
14cd0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
14ce0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
14cf0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
14d00 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
14d10 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
14d20 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
14d30 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
14d40 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
14d50 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
14d60 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
14d70 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
14d80 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
14d90 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
14da0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
14db0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
14dc0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14dd0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
14de0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
14df0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
14e00 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
14e10 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
14e20 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
14e30 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
14e40 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
14e50 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
14e60 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
14e70 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
14e80 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
14e90 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
14ea0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
14eb0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
14ec0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
14ed0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
14ee0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
14ef0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
14f00 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
14f10 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
14f20 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
14f30 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
14f40 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
14f50 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
14f60 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
14f70 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
14f80 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
14f90 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
14fa0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
14fb0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
14fc0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
14fd0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
14fe0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
14ff0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
15000 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
15010 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
15020 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
15030 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
15040 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
15050 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
15060 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15070 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
15080 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
15090 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
150a0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
150b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
150c0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
150d0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
150e0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
150f0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
15100 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
15110 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
15120 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15130 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15140 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
15150 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
15160 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
15170 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
15180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15190 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
151a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
151b0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
151c0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
151d0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
151e0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
151f0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
15200 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15210 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
15220 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
15230 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
15240 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
15250 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
15260 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
15270 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
15280 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
15290 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
152a0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
152b0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
152c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
152d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
152e0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
152f0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
15300 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
15310 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
15320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15330 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15340 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15350 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
15360 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
15370 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
15380 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
15390 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
153a0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
153b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
153c0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
153d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
153e0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
153f0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
15400 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
15410 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
15420 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
15430 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
15440 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
15450 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
15460 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
15470 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
15480 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
15490 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
154a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
154b0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
154c0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
154d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
154e0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
154f0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
15500 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
15510 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
15520 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
15530 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
15540 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
15550 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
15560 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
15570 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
15580 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
15590 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
155a0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
155b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
155c0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
155d0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
155e0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
155f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
15600 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
15610 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
15620 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
15630 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
15640 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15650 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
15660 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15670 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
15680 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
15690 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
156a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
156b0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
156c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
156d0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
156e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
156f0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
15700 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
15710 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
15720 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
15730 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
15740 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
15750 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
15760 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
15770 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
15780 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
15790 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
157a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
157b0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
157c0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
157d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
157e0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
157f0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
15800 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
15810 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
15820 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
15830 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
15840 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
15850 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
15860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15870 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15880 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
15890 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
158a0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
158b0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
158c0 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
158d0 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
158e0 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
158f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
15900 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
15910 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
15920 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
15930 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15940 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
15950 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
15960 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
15970 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
15980 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
15990 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
159a0 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
159b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
159c0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
159d0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
159e0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
159f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15a00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15a10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15a20 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15a30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15a40 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
15a50 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
15a60 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
15a70 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
15a80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15ab0 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
15ac0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
15ad0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
15ae0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
15af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15b00 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
15b10 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
15b20 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15b30 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
15b40 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
15b50 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
15b60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
15b70 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
15b80 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
15b90 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
15ba0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
15bb0 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
15bc0 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
15bd0 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
15be0 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
15bf0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
15c00 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
15c10 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
15c20 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
15c30 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
15c40 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
15c50 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
15c60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15c70 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
15c80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15c90 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15ca0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15cb0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
15cc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15cd0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15ce0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15cf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15d00 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
15d10 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
15d20 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
15d30 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
15d40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15d50 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
15d60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15d70 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
15d80 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
15d90 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
15da0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15db0 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
15dc0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
15dd0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15de0 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
15df0 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
15e00 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
15e10 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
15e20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15e30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15e40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15e50 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15e60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15e70 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
15e80 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
15e90 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
15ea0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
15eb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ed0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15ee0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
15ef0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
15f00 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
15f10 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
15f20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
15f30 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
15f40 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
15f50 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
15f60 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
15f70 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
15f80 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
15f90 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
15fa0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
15fb0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
15fc0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
15fd0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
15fe0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
15ff0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
16000 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
16010 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
16020 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
16030 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
16040 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
16050 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
16060 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
16070 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
16080 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
16090 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
160a0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
160b0 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
160c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
160d0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
160e0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
160f0 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
16100 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16110 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
16120 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
16130 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
16140 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
16150 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
16160 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
16170 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
16180 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16190 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
161a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
161b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
161c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
161d0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
161e0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
161f0 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
16200 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16210 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
16240 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
16250 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
16260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16270 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
16280 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
16290 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
162a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
162b0 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
162c0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
162d0 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
162e0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
162f0 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
16300 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
16310 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
16320 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
16330 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
16340 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
16350 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
16360 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
16370 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
16380 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
16390 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
163a0 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
163b0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
163c0 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
163d0 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
163e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
163f0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
16400 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
16410 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
16420 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
16430 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
16440 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
16450 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
16460 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
16470 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
16480 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
16490 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
164a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
164b0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
164c0 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
164d0 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
164e0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
164f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
16500 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
16510 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
16520 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
16530 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
16540 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
16550 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
16560 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
16570 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16580 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
16590 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
165a0 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
165b0 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
165c0 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
165d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
165e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
165f0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
16600 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
16610 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
16620 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16630 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
16640 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
16650 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
16660 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16670 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
16680 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
16690 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
166a0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
166b0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
166c0 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
166d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
166e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
166f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16700 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
16710 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
16720 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
16730 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
16740 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
16750 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
16760 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
16770 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
16780 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
16790 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
167a0 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
167b0 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
167c0 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
167d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
167e0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
167f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16800 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
16810 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
16820 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
16830 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
16840 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
16850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16860 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
16870 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
16880 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
16890 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
168a0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
168b0 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
168c0 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
168d0 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
168e0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
168f0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
16900 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16910 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16930 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
16940 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
16950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16960 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
16970 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
16980 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
16990 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
169a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
169b0 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
169c0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
169d0 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
169e0 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
169f0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
16a00 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
16a10 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
16a20 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
16a30 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
16a40 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
16a50 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
16a60 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
16a70 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
16a80 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
16a90 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
16aa0 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
16ab0 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
16ac0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
16ad0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
16ae0 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
16af0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
16b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16b10 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
16b20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
16b30 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
16b40 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
16b50 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
16b60 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16b70 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
16b80 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
16b90 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
16ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16bb0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
16bc0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16bd0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
16be0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16bf0 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
16c00 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
16c10 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
16c20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
16c30 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
16c40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
16c50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16c60 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
16c70 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
16c80 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
16c90 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
16ca0 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
16cb0 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
16cc0 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
16cd0 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
16ce0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
16cf0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
16d00 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
16d10 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
16d20 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
16d30 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
16d40 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
16d50 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
16d60 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
16d70 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
16d80 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
16d90 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
16da0 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
16db0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
16dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16dd0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16de0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16df0 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
16e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16e10 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
16e20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
16e30 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
16e40 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16e50 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
16e60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16e70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
16e80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
16e90 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
16ea0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
16eb0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
16ec0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
16ed0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
16ee0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
16ef0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
16f00 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
16f10 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
16f20 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
16f30 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
16f40 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
16f50 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
16f60 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
16f70 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
16f80 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
16f90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
16fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
16fb0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
16fc0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16fe0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16ff0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
17000 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55  Set the BTS_SECU
17010 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69  RE_DELETE flag i
17020 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
17030 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
17040 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
17050 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
17060 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17070 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
17080 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17090 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  TE.** setting af
170a0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
170b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
170c0 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
170d0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
170e0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
170f0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
17100 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
17110 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17120 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
17130 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
17140 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
17150 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
17160 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
17170 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  ) p->pBt->btsFla
17180 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
17190 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20  _DELETE;.  } .  
171a0 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
171b0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
171c0 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20  RE_DELETE)!=0;. 
171d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
171e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
171f0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  b;.}../*.** Chan
17200 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
17210 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
17220 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
17230 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
17240 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
17250 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
17260 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
17270 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
17280 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
17290 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
172a0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
172b0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
172c0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
172d0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
172e0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
172f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
17300 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
17310 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
17320 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
17330 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
17340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17350 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
17370 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
17380 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17390 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
173a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
173b0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
173c0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
173d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
173e0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
173f0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
17400 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
17410 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
17420 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
17430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17440 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
17450 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
17460 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
17470 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
17480 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
17490 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
174a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
174b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
174c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
174d0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
174e0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
174f0 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
17500 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
17510 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
17520 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
17530 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
17540 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
17550 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
17560 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17570 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17580 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
17590 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
175a0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
175b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
175c0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
175d0 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
175e0 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
175f0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17600 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
17610 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
17620 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
17630 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
17640 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
17650 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17660 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17670 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17680 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
17690 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
176a0 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
176b0 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
176c0 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
176d0 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
176e0 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
176f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
17700 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
17710 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
17720 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
17730 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
17740 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
17750 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
17760 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
17770 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
17780 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
17790 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
177a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
177b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
177c0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
177d0 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
177e0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
177f0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
17800 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17810 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
17820 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
17830 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
17840 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
17850 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
17860 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17870 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
17880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17890 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
178a0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
178b0 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
178c0 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
178d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
178e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
178f0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
17900 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
17910 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17920 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
17930 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
17940 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17950 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17960 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17970 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
17980 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
17990 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
179a0 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
179b0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
179c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
179d0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
179e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
179f0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
17a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17a10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17a20 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
17a30 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
17a40 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
17a50 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
17a60 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
17a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
17a80 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
17a90 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
17aa0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
17ab0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
17ac0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17ad0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
17ae0 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
17af0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
17b00 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
17b10 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
17b20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
17b30 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
17b40 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
17b50 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
17b60 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
17b70 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
17b80 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
17b90 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
17ba0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
17bb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17bc0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45  NOTADB;.    /* E
17bd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
17be0 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20  737-39999 Every 
17bf0 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
17c00 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e  abase file begin
17c10 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
17c20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62  e following 16 b
17c30 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35  ytes (in hex): 5
17c40 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35  3 51 4c 69 74 65
17c50 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a   20 66 6f 72 6d.
17c60 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20      ** 61 74 20 
17c70 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66  33 00. */.    if
17c80 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
17c90 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
17ca0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
17cb0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17cc0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  iled;.    }..#if
17cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17ce0 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65  WAL.    if( page
17cf0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
17d00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17d10 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
17d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17d30 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
17d40 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
17d50 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
17d60 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
17d70 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20  page1[18]>2 ){. 
17d80 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17d90 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
17da0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
17db0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
17dc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17dd0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17de0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17df0 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
17e00 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
17e10 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
17e20 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
17e30 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
17e40 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
17e50 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
17e60 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
17e70 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
17e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17e90 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
17ea0 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
17eb0 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
17ec0 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
17ed0 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
17ee0 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
17ef0 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
17f00 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
17f10 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
17f20 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
17f30 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
17f40 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
17f50 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
17f60 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
17f70 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
17f80 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
17f90 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
17fa0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
17fb0 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
17fc0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
17fd0 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d  s & BTS_NO_WAL)=
17fe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
17ff0 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
18000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18010 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
18020 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
18030 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18050 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18060 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18070 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51     }else{.#if SQ
18080 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
18090 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45  CHRONOUS!=SQLITE
180a0 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
180b0 43 48 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20  CHRONOUS.       
180c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
180d0 20 20 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20        Db *pDb;. 
180e0 20 20 20 20 20 20 20 69 66 28 20 28 64 62 3d 70         if( (db=p
180f0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
18100 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
18110 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
18120 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18130 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18140 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
18160 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a  Db->bSyncSet==0.
18170 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 44             && pD
18180 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d  b->safety_level=
18190 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  =SQLITE_DEFAULT_
181a0 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20  SYNCHRONOUS+1.  
181b0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
181c0 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
181d0 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54  ty_level = SQLIT
181e0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
181f0 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20  NCHRONOUS+1;.   
18200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18210 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
18220 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20  t->pPager,.     
18230 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
18240 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64  afety_level | (d
18250 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52  b->flags & PAGER
18260 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20  _FLAGS_MASK));. 
18270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18280 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
18290 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
182a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
182b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
182c0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  1);.          re
182d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
182e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
182f0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
18300 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
18310 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
18320 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18330 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
18340 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
18350 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
18360 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
18370 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
18380 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
18390 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
183a0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
183b0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
183c0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
183d0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
183e0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
183f0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
18400 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
18410 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
18420 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
18430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18440 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
18450 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
18460 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
18470 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18480 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18490 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
184a0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
184b0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
184c0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
184d0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
184e0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
184f0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
18500 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
18510 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
18520 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
18530 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
18540 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
18550 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
18560 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
18570 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
18580 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
18590 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
185a0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
185b0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
185c0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
185d0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
185e0 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
185f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
18600 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
18610 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
18620 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
18630 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
18640 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
18650 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
18660 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18670 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18680 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
18690 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
186a0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
186b0 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
186c0 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
186d0 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
186e0 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
186f0 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
18700 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
18710 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18720 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
18730 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
18740 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
18750 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
18760 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
18770 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18780 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
18790 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
187a0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
187b0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
187c0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
187d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
187e0 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
187f0 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
18800 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
18810 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
18820 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
18830 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
18840 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
18850 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
18860 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
18870 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
18880 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
18890 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
188a0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
188b0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
188c0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
188d0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
188e0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
188f0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
18900 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
18910 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
18920 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
18930 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
18940 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
18950 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
18960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
18970 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
18980 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
18990 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
189a0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
189b0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
189c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
189d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
189e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
189f0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
18a00 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
18a10 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
18a20 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
18a30 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
18a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18a50 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
18a60 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
18a70 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
18ab0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
18ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18ad0 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
18ae0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
18af0 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
18b00 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
18b10 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
18b20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18b30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
18b40 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18b50 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18b60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18b70 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
18b80 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
18b90 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
18ba0 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
18bb0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
18bc0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
18bd0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
18be0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
18bf0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
18c00 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
18c10 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
18c20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
18c30 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
18c40 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18c50 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18c60 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
18c70 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
18c80 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
18c90 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
18ca0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18cb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18cc0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18cd0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18ce0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
18cf0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
18d00 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
18d10 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18d20 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
18d30 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
18d40 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
18d50 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
18d60 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
18d70 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
18d80 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
18d90 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
18da0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
18db0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
18dc0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
18dd0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
18de0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
18df0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
18e00 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
18e10 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
18e20 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
18e30 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
18e40 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
18e50 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
18e60 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
18e70 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
18e80 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
18e90 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
18ea0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
18eb0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
18ec0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
18ed0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
18ee0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
18ef0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
18f00 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
18f10 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
18f20 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
18f30 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
18f40 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
18f50 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
18f60 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
18f70 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
18f80 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
18f90 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
18fa0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18fb0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
18fc0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
18fd0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
18fe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
18ff0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19000 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
19010 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
19020 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
19030 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
19040 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19050 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
19060 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
19070 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
19080 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
19090 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
190a0 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
190b0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
190c0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
190d0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
190e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
190f0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
19100 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
19110 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
19120 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
19130 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
19140 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19150 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
19160 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
19170 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
19180 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
19190 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
191a0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
191b0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
191c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
191d0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
191e0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
191f0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
19200 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
19210 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
19220 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
19230 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
19240 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
19250 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
19260 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
19270 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
19280 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
19290 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
192a0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
192b0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
192c0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
192d0 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
192e0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
192f0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
19300 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
19310 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
19320 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
19330 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
19340 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
19350 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
19360 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
19370 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
19380 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
19390 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
193a0 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
193b0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
193c0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
193d0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
193e0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
193f0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
19400 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
19410 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
19420 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
19430 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
19440 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
19450 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
19460 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
19470 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
19480 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
19490 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
194a0 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
194b0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
194c0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
194d0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
194e0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
194f0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
19500 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
19510 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
19520 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
19530 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
19540 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
19550 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
19560 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
19570 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
19580 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
19590 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
195a0 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
195b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
195c0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
195d0 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
195e0 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
195f0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
19600 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19610 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19620 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
19630 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
19640 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
19650 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19660 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
19670 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
19680 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
19690 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
196a0 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
196b0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
196c0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
196d0 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
196e0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
196f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
19700 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
19710 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
19720 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
19730 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
19740 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29  eNotNull(pPage1)
19750 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
19760 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
19770 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
19780 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
19790 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
197a0 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
197b0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
197c0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
197d0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
197e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
197f0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
19800 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
19810 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
19820 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
19830 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
19840 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19850 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19860 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19870 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
19880 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
19890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
198a0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
198b0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
198c0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
198d0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
198e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
198f0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
19900 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
19910 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19920 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
19930 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
19940 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
19950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
19960 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
19970 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
19980 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
19990 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
199a0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
199b0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
199c0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
199d0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
199e0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
199f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19a00 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
19a10 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
19a20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
19a30 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
19a40 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
19a50 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
19a60 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
19a70 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
19a80 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
19a90 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
19aa0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
19ab0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
19ac0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
19ad0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
19ae0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
19af0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
19b00 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19b10 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19b20 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
19b30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19b40 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
19b50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
19b60 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
19b70 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
19b80 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
19b90 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
19ba0 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
19bb0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
19bc0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
19bd0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
19be0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19bf0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
19c00 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
19c10 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
19c20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
19c30 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
19c40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19c50 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19c60 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
19c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19c80 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
19c90 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
19ca0 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
19cb0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
19cc0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
19cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
19ce0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
19cf0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
19d00 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
19d10 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19d20 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
19d30 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
19d40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19d50 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
19d60 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
19d70 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
19d80 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
19d90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19da0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19db0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
19dc0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
19dd0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
19de0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
19df0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
19e00 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19e10 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
19e20 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
19e30 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
19e40 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
19e50 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
19e60 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
19e70 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
19e80 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
19e90 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
19ea0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
19eb0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
19ec0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
19ed0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
19ee0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
19ef0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
19f00 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
19f10 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
19f20 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
19f30 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
19f40 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
19f50 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
19f60 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
19f70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
19f80 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
19f90 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
19fa0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
19fb0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
19fc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
19fd0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
19fe0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
19ff0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1a000 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1a010 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1a020 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1a030 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a040 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1a050 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a060 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1a070 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a080 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1a090 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a0a0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1a0b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a0c0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1a0d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a0e0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1a0f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1a100 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1a110 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1a120 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1a130 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1a140 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1a150 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1a160 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1a170 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1a180 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1a190 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1a1a0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1a1b0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1a1c0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1a1d0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1a1e0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1a1f0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1a200 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1a210 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1a220 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1a230 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1a240 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1a250 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1a260 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1a270 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1a280 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1a290 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1a2a0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1a2b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1a2c0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1a2d0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1a2e0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1a2f0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1a300 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1a310 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1a320 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1a330 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1a340 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1a350 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1a360 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1a370 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1a380 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1a390 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1a3a0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1a3b0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1a3c0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1a3d0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1a3e0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1a3f0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1a400 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1a410 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1a420 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1a430 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1a440 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1a450 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1a460 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1a470 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
1a480 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a490 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1a4a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
1a4b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a4c0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1a4d0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1a4e0 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1a4f0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1a500 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1a510 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1a520 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1a530 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1a540 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1a550 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1a560 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1a570 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1a580 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1a590 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1a5a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a5b0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1a5c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1a5d0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1a5e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1a5f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1a600 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1a610 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1a620 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1a630 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1a640 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1a650 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1a660 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1a670 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1a680 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1a690 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1a6a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1a6b0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a6c0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1a6d0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1a6e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a6f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1a700 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1a710 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1a720 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1a730 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1a740 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1a750 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1a760 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1a770 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1a780 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1a790 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1a7a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1a7b0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1a7c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1a7d0 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1a7e0 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1a7f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a800 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a810 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1a820 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1a830 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1a840 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1a850 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1a860 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1a870 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1a880 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1a890 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1a8a0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1a8b0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1a8c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1a8d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1a8e0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1a8f0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1a900 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1a910 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a930 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a940 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1a950 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1a960 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1a970 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1a980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1a990 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1a9a0 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1a9b0 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1a9c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1a9d0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1a9e0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1a9f0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1aa00 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1aa10 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1aa20 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1aa30 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1aa40 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1aa50 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1aa60 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1aa70 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1aa80 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1aa90 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1aaa0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1aab0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1aac0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1aad0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1aae0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1aaf0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1ab00 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1ab10 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1ab20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1ab30 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1ab40 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1ab50 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1ab60 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1ab70 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1ab80 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1ab90 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1aba0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1abb0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1abc0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1abd0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1abe0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1abf0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1ac00 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1ac10 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1ac20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1ac30 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1ac40 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1ac50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1ac60 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ac70 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1ac80 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1ac90 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1aca0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1acb0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1acc0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1acd0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1ace0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1acf0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1ad00 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1ad10 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1ad20 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1ad30 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1ad40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ad50 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1ad60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1ad70 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1ad80 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1ad90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ada0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1adb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1adc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1add0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1ade0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1adf0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1ae00 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1ae10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ae20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ae30 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1ae40 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1ae50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ae60 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1ae70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ae80 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1ae90 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1aea0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1aeb0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1aec0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1aed0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1aee0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1aef0 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1af00 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1af10 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
1af20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1af30 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1af40 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1af50 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1af60 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1af70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1af80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1af90 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1afa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1afb0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1afc0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1afd0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1afe0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1aff0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1b000 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1b010 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1b020 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1b030 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1b040 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1b050 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1b060 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1b070 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1b080 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1b090 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1b0a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b0b0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1b0c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b0d0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1b0e0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1b0f0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1b100 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1b110 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1b120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b130 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1b140 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1b150 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1b160 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1b170 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1b180 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1b190 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1b1a0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1b1b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1b1c0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1b1d0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1b1e0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1b1f0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1b200 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1b210 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1b220 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1b230 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1b240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b250 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1b260 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1b270 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1b280 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1b290 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1b2a0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1b2b0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1b2c0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1b2d0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1b2e0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1b2f0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1b300 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1b310 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1b320 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b330 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b340 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1b350 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1b360 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1b370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b380 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1b390 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1b3a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b3c0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1b3d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b3e0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1b3f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b410 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1b420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b430 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1b440 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1b450 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1b460 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1b470 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1b480 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1b490 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1b4a0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1b4b0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1b4c0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1b4d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1b4e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1b4f0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1b500 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1b510 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
1b520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b530 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1b540 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1b550 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1b560 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1b570 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1b580 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b5a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b5b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1b5c0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1b5d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1b5e0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1b5f0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1b600 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1b610 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1b620 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1b630 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1b640 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1b650 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1b660 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1b670 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1b680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1b690 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1b6a0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1b6b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1b6e0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1b6f0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1b720 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1b730 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b760 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1b770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1b780 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
1b790 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1b7a0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
1b7b0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1b7c0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1b7d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b7e0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1b7f0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1b800 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1b810 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1b820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b830 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
1b840 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
1b850 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1b860 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1b870 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1b880 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1b890 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1b8a0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1b8b0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1b8c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1b8d0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1b8e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1b8f0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1b900 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1b910 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1b920 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1b930 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1b940 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1b950 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1b960 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1b970 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1b980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1b990 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1b9a0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1b9b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1b9c0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1b9d0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1b9e0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
1b9f0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1ba00 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
1ba10 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1ba20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ba30 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1ba40 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1ba50 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1ba60 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1ba70 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1ba80 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1ba90 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1baa0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1bab0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1bac0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1bad0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1bae0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1baf0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1bb00 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1bb10 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1bb20 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1bb30 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1bb40 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1bb50 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1bb60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1bb70 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1bb80 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1bb90 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1bba0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1bbc0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1bbd0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1bbe0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1bbf0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1bc00 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1bc10 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1bc20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bc30 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1bc40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1bc50 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1bc60 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1bc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1bc80 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1bc90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1bca0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1bcb0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1bcc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bcd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1bce0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1bcf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1bd00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1bd10 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1bd20 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1bd30 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bd40 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1bd50 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1bd60 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1bd70 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1bd80 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1bd90 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1bda0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1bdb0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1bdc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bdd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bde0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1bdf0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1be00 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1be10 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
1be20 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1be30 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
1be40 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1be50 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1be60 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1be70 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1be80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1be90 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1bea0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1beb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1bec0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1bed0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1bee0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1bef0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1bf00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1bf10 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1bf20 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1bf30 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1bf40 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1bf50 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1bf60 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1bf70 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1bf80 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
1bf90 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c  ll+info.nSize-1<
1bfa0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
1bfb0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
1bfc0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
1bfd0 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1bfe0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20 20  info.nSize-4).  
1bff0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c000 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1c010 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1c020 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1c030 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c040 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c050 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1c060 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1c070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c080 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1c090 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1c0a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1c0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1c0c0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1c0d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1c0e0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1c0f0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1c100 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1c110 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c120 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1c130 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1c140 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c150 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1c160 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1c170 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c180 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c190 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
1c1a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
1c1b0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
1c1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c1d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1c1e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1c1f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1c200 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1c210 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1c220 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1c230 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1c240 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1c250 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1c260 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1c270 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1c280 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1c290 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1c2a0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1c2b0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1c2c0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1c2d0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c2e0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1c2f0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1c300 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1c310 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1c320 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1c330 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1c340 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1c350 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1c360 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1c370 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1c380 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1c390 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1c3a0 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1c3b0 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3d0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1c3e0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1c3f0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1c400 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1c410 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1c420 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1c430 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1c440 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1c450 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1c460 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1c470 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1c480 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4a0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1c4b0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1c4c0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1c4d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1c4e0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1c4f0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1c500 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1c510 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c520 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1c530 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1c540 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1c550 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1c560 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1c570 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c580 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1c590 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c5a0 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1c5b0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1c5c0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c5d0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1c5e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c5f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1c600 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1c610 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1c620 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1c630 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1c640 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1c650 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1c660 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1c670 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1c680 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1c690 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1c6a0 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1c6b0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1c6c0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1c6d0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1c6e0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1c6f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c700 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1c710 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1c720 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c730 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1c740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c760 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1c770 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1c780 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1c790 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1c7a0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1c7b0 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1c7c0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1c7d0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1c7e0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1c7f0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1c800 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1c810 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1c820 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1c830 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1c840 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1c850 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1c860 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1c870 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1c880 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1c890 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1c8a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1c8b0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1c8c0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1c8d0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1c8e0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1c8f0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1c900 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1c910 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1c920 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1c930 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1c940 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1c950 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1c960 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1c970 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c990 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c9a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c9b0 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1c9c0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1c9d0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1c9e0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1c9f0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1ca00 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1ca10 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ca20 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1ca30 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1ca40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ca60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ca70 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1ca80 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1ca90 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1caa0 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1cab0 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1cac0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1cad0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1cae0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1caf0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1cb00 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1cb10 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1cb20 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1cb30 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1cb40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1cb50 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1cb60 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1cb70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cb80 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1cb90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1cba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cbb0 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1cbc0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1cbd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cbe0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1cbf0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1cc00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1cc10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1cc20 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1cc30 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1cc40 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1cc50 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1cc60 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1cc70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1cc80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cc90 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1cca0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1ccb0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1ccc0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1ccd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cce0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1ccf0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1cd00 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1cd10 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1cd20 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1cd30 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1cd40 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1cd50 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1cd60 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1cd70 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1cd80 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1cd90 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1cda0 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1cdb0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1cdc0 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1cdd0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1cde0 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1cdf0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1ce00 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1ce10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1ce20 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1ce30 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1ce40 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1ce50 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1ce60 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1ce70 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1ce80 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1ce90 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1cea0 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1ceb0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1cec0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1ced0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1cee0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1cef0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1cf00 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1cf10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1cf20 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1cf30 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1cf40 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1cf50 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1cf60 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1cf70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1cf80 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1cf90 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1cfa0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1cfb0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1cfc0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1cfd0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1cfe0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1cff0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1d000 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1d010 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1d020 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1d030 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1d040 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1d050 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1d060 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1d070 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1d080 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1d090 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1d0a0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1d0b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1d0c0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1d0d0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1d0e0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1d0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d100 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1d110 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1d120 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1d130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1d140 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d150 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1d160 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1d170 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1d180 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1d190 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1d1a0 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1d1b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d1c0 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1d1d0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1d1e0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1d1f0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1d200 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1d210 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1d220 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1d230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d240 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1d250 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1d260 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1d270 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1d280 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1d290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d2a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d2b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1d2c0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1d2d0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1d2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d2f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1d300 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1d310 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1d320 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1d330 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1d340 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1d350 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1d360 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
1d370 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1d380 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
1d390 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
1d3a0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
1d3b0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
1d3c0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
1d3d0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
1d3e0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
1d3f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1d400 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
1d410 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
1d420 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
1d430 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
1d440 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
1d450 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d460 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1d470 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
1d480 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1d490 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1d4a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1d4b0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1d4c0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
1d4d0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
1d4e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d4f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d500 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d520 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1d530 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
1d540 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d550 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1d560 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
1d570 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
1d580 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
1d590 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
1d5a0 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
1d5b0 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
1d5c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
1d5d0 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
1d5e0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
1d5f0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
1d600 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1d610 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1d620 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
1d630 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
1d640 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
1d650 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1d660 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1d670 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
1d680 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1d690 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
1d6a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d6b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d6c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d6d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
1d6e0 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
1d6f0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
1d700 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
1d710 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
1d720 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
1d730 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
1d740 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1d750 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
1d760 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
1d770 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d780 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
1d790 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
1d7a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
1d7b0 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
1d7c0 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
1d7d0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
1d7e0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
1d7f0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
1d800 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
1d810 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1d820 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1d830 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1d840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1d850 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1d860 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1d870 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1d880 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1d890 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1d8a0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1d8b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d8c0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1d8d0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1d8e0 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1d8f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d910 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1d920 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1d930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1d950 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1d960 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1d970 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1d980 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1d990 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1d9a0 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1d9b0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1d9c0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1d9d0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1d9e0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1d9f0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1da00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1da10 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1da20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1da30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1da40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1da50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1da60 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1da70 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1da80 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1da90 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1daa0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1dab0 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1dac0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1dad0 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1dae0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1daf0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1db00 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1db10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1db20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1db30 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1db40 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1db50 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1db60 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1db70 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1db80 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1db90 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1dba0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1dbb0 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1dbc0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1dbd0 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1dbe0 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1dbf0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1dc00 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1dc10 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1dc20 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1dc30 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1dc40 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1dc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dc70 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1dc80 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1dc90 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dcc0 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1dcd0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1dce0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd00 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1dd10 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1dd20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1dd30 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1dd40 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1dd50 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1dd60 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1dd70 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1dd80 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1dd90 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1dda0 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1ddb0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1ddc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ddd0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1dde0 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1ddf0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1de00 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1de10 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1de20 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1de30 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1de40 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1de50 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1de60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1de70 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1de80 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1de90 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1dea0 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1deb0 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1dec0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1ded0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1dee0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1def0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1df00 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1df10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1df20 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1df30 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1df40 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1df50 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1df60 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1df70 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1df80 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1df90 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1dfa0 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1dfb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1dfc0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1dfd0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1dfe0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1dff0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1e000 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1e010 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1e020 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e030 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1e040 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e050 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1e060 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e070 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1e080 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1e090 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1e0a0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1e0b0 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1e0c0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1e0d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e0e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e0f0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1e100 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1e110 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1e120 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1e130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1e140 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e150 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1e160 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1e170 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1e180 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1e190 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1e1a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e1b0 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1e1c0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e1d0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1e1e0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1e1f0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1e200 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1e210 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e240 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1e250 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1e260 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1e270 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e280 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1e290 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1e2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e2c0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1e2d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e2e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1e2f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e300 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e310 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1e320 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1e330 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1e340 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1e350 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1e360 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1e370 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1e380 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1e390 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1e3a0 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1e3b0 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1e3c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1e3d0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1e3e0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1e3f0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1e400 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1e410 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1e420 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1e430 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1e440 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1e450 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1e460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1e470 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1e480 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1e490 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e4a0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1e4b0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1e4c0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1e4d0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1e4e0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1e4f0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
1e500 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e510 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e520 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1e530 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1e540 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1e550 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1e560 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1e570 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1e580 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1e590 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e5a0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1e5b0 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1e5c0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1e5d0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1e5e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e5f0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1e600 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1e610 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1e620 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1e630 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1e640 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1e650 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1e660 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1e670 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1e680 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1e690 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1e6a0 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1e6b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e6c0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1e6d0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1e6e0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e6f0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1e700 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1e710 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1e720 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1e730 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1e740 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1e750 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1e760 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1e770 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1e780 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1e790 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1e7a0 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1e7b0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1e7c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e7d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e7e0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1e7f0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e800 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e810 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1e820 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1e830 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1e840 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1e850 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1e860 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e870 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1e880 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1e890 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1e8a0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1e8b0 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1e8c0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1e8d0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1e8e0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1e8f0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1e900 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1e910 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1e920 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1e930 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1e940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1e950 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1e960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e970 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1e980 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1e990 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1e9a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e9b0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1e9c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e9d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e9e0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1e9f0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1ea00 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1ea10 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1ea20 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1ea30 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1ea40 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1ea50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1ea60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1ea80 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1ea90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1eaa0 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1eab0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1eac0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1ead0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1eae0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1eaf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1eb00 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1eb10 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1eb20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1eb30 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1eb40 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1eb50 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1eb60 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1eb70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1eb80 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1eb90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1eba0 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1ebb0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1ebc0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1ebd0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1ebe0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1ebf0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1ec00 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1ec10 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1ec20 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1ec30 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1ec40 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1ec50 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1ec60 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1ec70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ec80 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1ec90 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1eca0 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1ecb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ecc0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1ecd0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1ece0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1ecf0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1ed00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ed10 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1ed20 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1ed30 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1ed40 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1ed50 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1ed60 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1ed70 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1ed80 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1ed90 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1eda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1edb0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1edc0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1edd0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1ede0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1edf0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1ee00 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1ee10 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1ee20 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1ee30 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1ee40 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1ee50 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1ee60 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1ee70 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1ee80 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1ee90 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1eea0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1eeb0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1eec0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1eed0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1eee0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1eef0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1ef00 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1ef10 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1ef20 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1ef30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1ef40 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1ef50 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1ef60 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1ef70 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1ef80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ef90 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1efa0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1efb0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1efc0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1efd0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1efe0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1eff0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1f000 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1f010 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1f020 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1f030 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1f040 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1f050 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1f060 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1f070 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1f080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f090 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f0a0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1f0b0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1f0c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f0d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1f0e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f0f0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1f100 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f110 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1f120 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f140 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f150 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1f160 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1f170 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1f180 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1f190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f1b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f1c0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1f1d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f1e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f1f0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f200 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f210 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1f220 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1f230 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1f240 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1f250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1f260 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1f270 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1f280 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1f290 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f2a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f2b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f2c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f2d0 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1f2e0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1f2f0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1f300 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1f310 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1f320 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1f330 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1f340 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1f350 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1f360 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f370 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1f380 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1f390 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1f3a0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1f3b0 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1f3c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f3d0 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1f3e0 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1f3f0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1f400 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1f410 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1f420 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1f430 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1f440 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1f450 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1f460 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1f470 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1f480 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1f490 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1f4a0 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1f4b0 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1f4c0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1f4d0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1f4e0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1f4f0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1f500 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1f510 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1f520 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1f530 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1f540 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1f550 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1f560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1f570 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1f580 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1f590 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1f5a0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1f5b0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1f5c0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1f5d0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1f5e0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1f5f0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1f600 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1f610 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1f620 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1f630 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1f640 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1f650 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1f660 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1f670 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1f680 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1f690 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1f6a0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1f6b0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1f6c0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1f6d0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1f6e0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1f6f0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1f700 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1f710 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1f720 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1f730 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1f740 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1f750 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1f760 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1f770 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1f780 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1f790 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1f7a0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1f7b0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1f7c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1f7d0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1f7e0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1f7f0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1f800 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1f810 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1f820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f830 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1f840 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1f850 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1f860 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1f870 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f880 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1f890 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1f8a0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1f8b0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1f8c0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1f8d0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1f8e0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1f8f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1f900 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1f910 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1f920 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1f930 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1f940 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1f950 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1f960 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1f970 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1f980 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1f990 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1f9a0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1f9b0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1f9c0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1f9d0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1f9e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1f9f0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1fa00 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1fa10 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1fa20 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1fa30 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1fa40 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1fa50 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1fa60 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1fa70 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1fa80 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1fa90 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1faa0 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1fab0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1fac0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1fad0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1fae0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1faf0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1fb00 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1fb10 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1fb20 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1fb30 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1fb40 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1fb50 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1fb60 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1fb70 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1fb80 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1fb90 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1fba0 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1fbb0 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1fbc0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1fbd0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1fbe0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1fbf0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1fc00 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1fc10 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1fc20 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1fc30 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1fc40 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1fc50 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1fc60 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1fc70 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1fc80 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1fc90 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1fca0 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1fcb0 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1fcc0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1fcd0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1fce0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1fcf0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1fd00 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1fd10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1fd20 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1fd30 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1fd40 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1fd50 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1fd60 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1fd70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1fd80 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1fd90 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1fda0 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1fdb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1fdc0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1fdd0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1fde0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fdf0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1fe00 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1fe10 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1fe20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1fe30 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1fe40 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1fe50 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1fe60 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1fe70 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1fe80 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1fe90 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1fea0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1feb0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1fec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1fed0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1fee0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1fef0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1ff00 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1ff10 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1ff20 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1ff30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1ff40 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1ff50 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1ff60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ff70 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1ff80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ff90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ffa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ffb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
1ffc0 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
1ffd0 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
1ffe0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
1fff0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
20000 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20010 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
20020 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
20030 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
20040 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
20050 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
20060 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20070 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20090 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
200a0 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
200b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
200c0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
200d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
200e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
200f0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
20100 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20110 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
20120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20130 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20140 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20150 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
20160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
20170 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20190 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
201a0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
201b0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
201c0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
201d0 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
201e0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
201f0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
20200 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
20210 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
20220 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
20230 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
20240 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
20250 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
20260 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
20270 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
20280 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
20290 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
202a0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
202b0 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
202c0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
202d0 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
202e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
202f0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
20300 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
20310 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
20320 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
20330 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
20340 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
20350 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
20360 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
20370 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
20380 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
20390 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
203a0 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
203b0 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
203c0 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
203d0 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
203e0 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
203f0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
20400 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
20410 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
20420 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
20430 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
20440 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
20450 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
20460 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
20470 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
20480 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
20490 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
204a0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
204b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
204c0 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
204d0 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
204e0 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
204f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
20500 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
20510 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
20520 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
20530 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
20540 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
20550 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
20560 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
20570 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
20580 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
20590 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
205a0 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
205b0 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
205c0 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
205d0 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
205e0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
205f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
20600 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
20610 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
20620 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
20630 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
20640 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
20650 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
20660 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
20670 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
20680 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
20690 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
206a0 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
206b0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
206c0 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
206d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
206e0 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
206f0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
20700 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
20710 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
20720 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
20730 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20740 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
20750 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
20760 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
20770 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
20780 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
20790 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
207a0 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
207b0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
207c0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
207d0 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
207e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
207f0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
20800 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
20810 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
20820 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
20830 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
20840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
20860 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
20870 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
20880 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
20890 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
208a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
208b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
208c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
208d0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
208e0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
208f0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
20900 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
20910 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
20920 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
20930 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
20940 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
20950 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  ++){.        rel
20960 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
20970 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[i]);.        
20980 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
20990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
209a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
209b0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
209c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
209d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
209e0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
209f0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
20a00 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
20a10 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
20a20 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
20a30 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
20a40 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
20a50 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
20a60 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
20a70 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20a80 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
20a90 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
20aa0 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20ab0 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
20ac0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
20ad0 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
20ae0 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
20af0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
20b00 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
20b10 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
20b20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20b30 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
20b40 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
20b50 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
20b60 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
20b70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
20b80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20b90 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
20ba0 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
20bb0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
20bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
20bd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20be0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
20bf0 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
20c00 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
20c10 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
20c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
20c30 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
20c40 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
20c50 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
20c60 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
20c70 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20c80 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
20c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20ca0 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
20cb0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
20cc0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
20cd0 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
20ce0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
20cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20d00 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
20d10 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
20d20 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
20d30 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
20d40 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
20d50 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
20d60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20d70 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
20d80 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
20d90 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
20da0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
20db0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
20dc0 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
20dd0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
20de0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20df0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
20e00 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
20e10 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
20e20 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
20e30 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
20e40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
20e50 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
20e60 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
20e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20e80 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
20e90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
20ea0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
20eb0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
20ec0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
20ed0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
20ee0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
20ef0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
20f00 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
20f10 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
20f20 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
20f30 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
20f40 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
20f50 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
20f60 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
20f70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
20f80 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
20f90 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
20fa0 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
20fb0 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
20fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
20fd0 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
20fe0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
20ff0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
21000 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21010 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
21020 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
21030 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
21040 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21050 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
21060 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
21070 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
21080 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
21090 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
210a0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
210b0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
210c0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
210d0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
210e0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
210f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21100 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21110 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21120 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
21130 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
21140 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21150 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
21160 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
21170 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
21180 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
21190 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
211a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
211b0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
211c0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
211d0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
211e0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
211f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
21200 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
21210 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
21220 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
21230 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
21240 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
21250 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
21260 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
21270 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
21280 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
21290 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
212a0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
212b0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
212c0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
212d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
212e0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
212f0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
21300 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
21310 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
21320 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
21330 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
21340 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
21350 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
21360 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
21370 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
21380 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
21390 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
213a0 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
213b0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
213c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
213d0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
213e0 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
213f0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
21400 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
21410 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
21420 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
21430 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
21440 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
21450 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
21460 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
21470 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
21480 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
21490 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
214a0 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
214b0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
214c0 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
214d0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
214e0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
214f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
21500 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
21510 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
21520 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
21530 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
21540 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21550 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
21560 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21570 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
21580 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
21590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
215a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
215b0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
215c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
215d0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
215e0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
215f0 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
21600 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
21610 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21620 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
21630 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
21640 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
21650 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
21660 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
21670 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
21680 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
21690 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
216a0 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
216b0 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
216c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
216d0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
216e0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
216f0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
21700 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
21710 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
21720 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
21730 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
21740 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
21750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21760 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
21770 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
21780 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
21790 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
217a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
217b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
217c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
217d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
217e0 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
217f0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
21800 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
21810 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
21820 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
21830 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
21840 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
21850 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
21860 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
21870 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
21880 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
21890 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
218a0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
218b0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
218c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
218d0 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
218e0 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
218f0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
21900 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
21910 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
21920 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
21930 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
21940 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
21950 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
21960 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
21970 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
21980 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
21990 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
219a0 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
219b0 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
219c0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
219d0 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
219e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
219f0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
21a00 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
21a10 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
21a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21a30 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
21a40 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
21a50 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
21a60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21a70 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
21a80 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
21a90 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
21aa0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
21ab0 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
21ac0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
21ad0 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
21ae0 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
21af0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
21b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
21b10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
21b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21b30 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
21b40 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
21b50 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
21b60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
21b80 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
21b90 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
21ba0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
21bb0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
21bc0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
21bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21be0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
21bf0 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
21c00 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
21c10 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
21c20 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
21c30 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21c40 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
21c50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
21c60 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
21c70 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
21c80 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
21c90 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
21ca0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
21cb0 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
21cc0 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
21cd0 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
21ce0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
21cf0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
21d00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21d10 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
21d20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21d30 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
21d40 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
21d50 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
21d60 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
21d70 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
21d80 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
21d90 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
21da0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
21db0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
21dc0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
21dd0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
21de0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
21df0 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
21e00 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
21e10 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
21e20 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
21e30 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
21e40 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
21e50 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
21e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21e70 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45  .** If the BTREE
21e80 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72  _WRCSR bit of wr
21e90 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  Flag is clear, t
21ea0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
21eb0 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73  an only.** be us
21ec0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20  ed for reading. 
21ed0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
21ee0 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20  CSR bit is set, 
21ef0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
21f00 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ** can be used f
21f10 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
21f20 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  r writing if oth
21f30 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
21f40 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65  r writing.** are
21f50 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
21f60 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  e are the condit
21f70 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
21f80 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a  e met in order.*
21f90 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  * for writing to
21fa0 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
21fb0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
21fc0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
21fd0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
21fe0 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42  lag containing B
21ff0 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a  TREE_WRCSR.**.**
22000 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
22010 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
22020 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
22030 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
22040 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
22050 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
22060 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
22070 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
22080 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
22090 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
220a0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
220b0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
220c0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
220d0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
220e0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
220f0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
22100 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
22110 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
22120 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
22130 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
22140 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
22150 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
22160 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
22170 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
22180 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
22190 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
221a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
221b0 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
221c0 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66  FORDELETE bit of
221d0 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69   wrFlag may opti
221e0 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66  onally be set if
221f0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20   BTREE_WRCSR.** 
22200 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44  is set.  If FORD
22210 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68  ELETE is set, th
22220 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  at is a hint to 
22230 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
22240 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  on that.** this 
22250 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
22260 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b   be used to seek
22270 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65   to and delete e
22280 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64  ntries of an ind
22290 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ex.** as part of
222a0 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45   a larger DELETE
222b0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
222c0 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20   FORDELETE hint 
222d0 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a  is not used by.*
222e0 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * this implement
222f0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61  ation.  But in a
22300 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c   hypothetical al
22310 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67  ternative storag
22320 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20  e engine .** in 
22330 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72  which index entr
22340 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ies are automati
22350 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
22360 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  en corresponding
22370 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61   table.** rows a
22380 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20  re deleted, the 
22390 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69  FORDELETE flag i
223a0 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c  s a hint that al
223b0 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54  l SEEK and DELET
223c0 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  E.** operations 
223d0 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63  on this cursor c
223e0 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64  an be no-ops and
223f0 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74   all READ operat
22400 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74  ions can .** ret
22410 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28  urn a null row (
22420 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78  2-bytes: 0x01 0x
22430 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  00)..**.** No ch
22440 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
22450 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
22460 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
22470 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
22480 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
22490 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
224a0 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
224b0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
224c0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
224d0 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
224e0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
224f0 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
22500 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
22510 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
22520 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
22530 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
22540 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
22550 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
22560 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
22570 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
22580 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
225b0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
225c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
225f0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
22600 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
22610 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
22640 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22650 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
22660 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
22670 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22680 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
22690 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
226a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
226d0 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
226e0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
226f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22710 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
22720 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72  andle */.  BtCur
22730 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  sor *pX;        
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65    /* Looping ove
22760 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73  r other all curs
22770 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ors */..  assert
22780 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
22790 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
227a0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
227b0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  =0 .       || wr
227c0 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53  Flag==BTREE_WRCS
227d0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  R .       || wrF
227e0 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53  lag==(BTREE_WRCS
227f0 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  R|BTREE_FORDELET
22800 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  E) .  );..  /* T
22810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
22820 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
22830 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
22840 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
22850 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
22860 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
22870 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
22880 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
22890 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
228a0 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
228b0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
228c0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
228d0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
228e0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
228f0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
22900 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
22910 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
22920 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
22930 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a  o!=0, (wrFlag?2:
22940 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  1)) );.  assert(
22950 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
22960 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
22970 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
22980 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
22990 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
229a0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
229b0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
229c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
229d0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
229e0 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
229f0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
22a00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22a10 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
22a20 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
22a30 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22a40 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
22a50 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
22a60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
22a70 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
22a80 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
22a90 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
22aa0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
22ab0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
22ac0 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
22ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22ae0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
22af0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
22b00 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
22b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
22b20 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
22b30 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
22b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
22b50 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
22b60 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
22b70 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
22b80 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
22b90 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
22ba0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
22bb0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
22bc0 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
22bd0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
22be0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
22bf0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
22c00 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
22c10 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
22c20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
22c30 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
22c40 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75   pBt;.  pCur->cu
22c50 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
22c60 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ? BTCF_WriteFlag
22c70 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   : 0;.  pCur->cu
22c80 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
22c90 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
22ca0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
22cb0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
22cc0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
22cd0 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
22ce0 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
22cf0 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
22d00 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
22d10 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
22d20 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
22d30 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
22d40 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
22d50 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
22d60 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
22d70 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
22d80 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
22d90 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
22da0 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
22db0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
22dc0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
22dd0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
22de0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
22df0 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
22e00 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
22e10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
22e20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
22e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22e40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22e50 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
22e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
22e90 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
22ea0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
22ed0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
22ee0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
22ef0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
22f20 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
22f30 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
22f40 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f60 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
22f70 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
22f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22fb0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
22fc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
22fd0 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
22fe0 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
22ff0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23000 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
23010 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
23020 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
23030 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
23040 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
23050 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
23060 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23070 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
23080 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23090 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
230a0 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
230b0 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
230c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
230d0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
230e0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
230f0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
23100 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
23110 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
23120 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
23130 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
23140 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
23150 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
23160 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
23170 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
23180 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
23190 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
231a0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
231b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
231c0 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
231d0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
231e0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
231f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
23200 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
23210 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
23220 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
23230 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
23240 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
23250 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
23260 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
23270 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
23280 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
23290 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
232a0 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
232b0 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
232c0 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
232d0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
232e0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
232f0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
23300 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
23310 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
23320 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
23330 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
23340 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
23350 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
23360 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
23370 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
23380 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
23390 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
233a0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
233b0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
233c0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
233d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
233e0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
233f0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
23400 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
23410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23420 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
23430 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23440 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
23450 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
23460 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
23470 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
23480 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23490 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
234a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
234b0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
234c0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
234d0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
234e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
234f0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
23500 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
23510 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
23520 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
23530 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
23540 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
23550 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
23560 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
23570 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
23580 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
23590 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
235a0 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
235b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
235c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
235d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
235e0 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
235f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
23600 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
23610 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
23620 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
23630 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
23640 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23650 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
23660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
23670 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
23680 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
23690 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
236a0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
236b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
236c0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
236d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
236e0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
236f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23700 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
23710 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
23720 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
23730 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
23740 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
23750 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
23760 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
23770 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
23780 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
23790 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
237a0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
237b0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
237c0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
237d0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
237e0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
237f0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
23800 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
23810 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
23820 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
23830 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
23840 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
23850 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
23860 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23870 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
23880 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
23890 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
238a0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
238b0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
238c0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
238d0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
238e0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
238f0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
23900 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
23910 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
23920 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
23930 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
23940 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
23950 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
23960 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
23970 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
23980 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
23990 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
239a0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
239b0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
239c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
239d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
239e0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
239f0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
23a00 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
23a10 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
23a20 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
23a30 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
23a40 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
23a50 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
23a60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
23a70 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23a80 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
23a90 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
23aa0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
23ab0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
23ac0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
23ad0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
23ae0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
23af0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
23b00 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
23b10 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
23b20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
23b30 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
23b40 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
23b50 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
23b60 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
23b70 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
23b80 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
23b90 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
23ba0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
23bb0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23bc0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
23bd0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
23be0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
23bf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23c00 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
23c10 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
23c20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
23c30 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
23c40 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64  er key or "rowid
23c50 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  " for a table bt
23c60 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ree..** This rou
23c70 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tine is only val
23c80 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  id for a cursor 
23c90 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
23ca0 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e   into a.** ordin
23cb0 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e  ary table btree.
23cc0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
23cd0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  points to an ind
23ce0 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69  ex btree or.** i
23cf0 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72  s invalid, the r
23d00 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f  esult of this ro
23d10 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e  utine is undefin
23d20 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ed..*/.i64 sqlit
23d30 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
23d40 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
23d50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
23d60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23d70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23d80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23d90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23da0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
23db0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65  urIntKey );.  ge
23dc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23dd0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
23de0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a  info.nKey;.}../*
23df0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
23e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
23e10 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  f payload for th
23e20 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43 75  e entry that pCu
23e30 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  r is.** currentl
23e40 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  y pointing to.  
23e50 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65 73  For table btrees
23e60 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
23e70 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  he amount.** of 
23e80 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78  data.  For index
23e90 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
23ea0 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f  ll be the size o
23eb0 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  f the key..**.**
23ec0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23ed0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
23ee0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
23ef0 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
23f00 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
23f10 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
23f20 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
23f30 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
23f40 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
23f50 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
23f60 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
23f70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
23f80 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  /.u32 sqlite3Btr
23f90 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74  eePayloadSize(Bt
23fa0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23fb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23fc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23fe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23ff0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
24000 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
24010 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
24020 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.nPayload;.}.
24030 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
24040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
24050 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
24060 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24070 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
24080 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
24090 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
240a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
240b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
240c0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
240d0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
240e0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
240f0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
24100 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
24110 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
24120 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
24130 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24140 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
24150 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
24160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
24170 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
24180 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
24190 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
241a0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
241b0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
241c0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
241d0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
241e0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
241f0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
24200 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
24210 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
24220 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
24230 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
24240 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
24250 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
24260 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
24270 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
24280 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
24290 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
242a0 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
242b0 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
242c0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
242d0 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
242e0 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
242f0 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
24300 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
24310 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
24320 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
24330 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
24340 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
24350 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
24360 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
24370 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
24380 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
24390 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
243a0 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
243b0 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
243c0 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
243d0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
243e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
243f0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
24400 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24420 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
24430 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
24440 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
24450 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24460 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
24470 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
24480 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
24490 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
244a0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
244b0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
244c0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
244d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
244e0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
244f0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
24500 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
24510 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
24520 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
24530 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24540 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
24550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24560 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
24570 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
24580 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
24590 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
245a0 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
245b0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
245c0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
245d0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
245e0 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
245f0 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
24600 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
24610 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
24620 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
24630 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
24640 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
24650 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
24660 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
24670 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
24680 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
24690 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
246a0 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
246b0 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
246c0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
246d0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
246e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
246f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
24700 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
24710 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
24720 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
24730 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
24740 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
24750 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
24760 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
24770 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
24780 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
24790 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
247a0 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
247b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
247c0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
247d0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
247e0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
247f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24800 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
24810 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
24820 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
24830 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
24840 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
24850 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
24860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24870 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
24880 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
24890 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
248a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
248b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
248c0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
248d0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
248e0 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
248f0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24900 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
24910 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
24920 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
24930 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
24940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24950 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
24960 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
24970 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
24980 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
24990 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
249a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
249b0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
249c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
249d0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
249e0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
249f0 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
24a00 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
24a10 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
24a20 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
24a30 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
24a40 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
24a50 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
24a60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
24a70 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
24a80 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
24a90 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
24aa0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
24ab0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
24ac0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
24ad0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
24ae0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
24af0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
24b00 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
24b10 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
24b20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24b30 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
24b40 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
24b50 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
24b60 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
24b70 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
24b80 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
24b90 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
24ba0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
24bb0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
24bc0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
24bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24be0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
24bf0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
24c00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24c10 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
24c20 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
24c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24c40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
24c50 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
24c60 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
24c70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24c80 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
24c90 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24cb0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
24cc0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
24cd0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
24ce0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
24cf0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
24d00 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
24d10 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
24d20 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
24d30 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
24d40 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
24d50 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
24d60 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
24d70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24d80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
24d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24da0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24db0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
24dc0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
24dd0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
24de0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
24df0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
24e00 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
24e10 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
24e20 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
24e30 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
24e40 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
24e50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24e60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24e70 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
24e80 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
24e90 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
24ea0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
24eb0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
24ec0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
24ed0 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
24ee0 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
24ef0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
24f00 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
24f10 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
24f20 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
24f30 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
24f40 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
24f50 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
24f60 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
24f70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
24f80 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32  ow cache..**   2
24f90 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
24fa0 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f  is a read. Do no
24fb0 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  t populate the o
24fc0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24fd0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
24fe0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
24ff0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
25000 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
25010 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
25020 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
25030 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
25040 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
25050 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
25060 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
25070 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
25080 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
25090 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
250a0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
250b0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
250c0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
250d0 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
250e0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
250f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
25100 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67  d the.** eOp arg
25110 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20  ument is not 2, 
25120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
25130 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
25140 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
25150 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68  .** populates th
25160 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
25170 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
25180 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
25190 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
251a0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
251b0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
251c0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
251d0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
251e0 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
251f0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
25200 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25210 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
25220 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25230 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
25240 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
25250 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
25260 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
25270 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
25280 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
25290 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
252a0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
252b0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
252c0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
252d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
252e0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
252f0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
25300 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
25310 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
25320 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
25330 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
25340 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
25350 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
25360 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
25370 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
25380 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
25390 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
253a0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
253b0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
253c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
253d0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
253e0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
253f0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25400 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
25410 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
25420 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
25430 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
25440 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
25450 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
25460 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
25470 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25480 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
25490 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
254a0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
254b0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
254c0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
254d0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
254e0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
254f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25500 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
25510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25520 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
25530 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25540 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
25560 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
25570 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
25580 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
25590 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
255b0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
255c0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
255d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
255e0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
255f0 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
25600 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
25610 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  fStart = pBuf;. 
25620 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20   int bEnd;      
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25650 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
25660 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
25670 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
25680 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
25690 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
256a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
256b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
256c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
256d0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
256e0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
256f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25700 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25710 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66  rt( eOp!=2 || of
25720 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
25730 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72   Always start fr
25740 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72  om beginning for
25750 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65   eOp==2 */..  ge
25760 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
25770 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
25780 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
25790 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  d;.#ifdef SQLITE
257a0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
257b0 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f  _READ.  bEnd = o
257c0 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d  ffset+amt==pCur-
257d0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
257e0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
257f0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
25800 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25810 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
25820 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
25830 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
25840 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
25850 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
25860 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
25870 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
25880 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
25890 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
258a0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
258b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
258c0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
258d0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
258e0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
258f0 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
25900 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
25910 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25920 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
25930 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
25940 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
25950 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
25960 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
25970 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
25980 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
25990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
259a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
259b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
259c0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
259d0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
259e0 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
259f0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
25a00 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
25a10 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
25a20 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
25a30 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
25a40 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
25a50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
25a60 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
25a70 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
25a80 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
25a90 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
25aa0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
25ab0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
25ac0 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
25ad0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25ae0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
25af0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
25b00 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
25b10 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
25b20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25b30 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
25b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25b50 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
25b60 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
25b70 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
25b80 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
25b90 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
25ba0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
25bb0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
25bc0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
25bd0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
25be0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25bf0 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
25c00 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
25c10 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
25c20 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25c30 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
25c40 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
25c50 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
25c60 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
25c70 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
25c80 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
25c90 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
25ca0 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
25cb0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
25cc0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
25cd0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
25ce0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
25cf0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
25d00 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
25d10 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
25d20 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
25d30 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
25d40 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
25d50 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
25d60 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
25d70 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
25d80 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
25d90 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
25da0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
25db0 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
25dc0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25dd0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
25de0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
25df0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
25e00 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
25e10 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
25e20 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
25e30 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
25e40 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
25e50 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
25e60 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
25e70 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
25e80 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25e90 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
25ea0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
25eb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
25ec0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
25ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25ee0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
25ef0 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
25f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
25f10 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20  r->nOvflAlloc = 
25f20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20  nOvfl*2;.       
25f30 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25f40 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
25f50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25f80 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
25f90 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
25fa0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
25fb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
25fc0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
25fd0 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
25fe0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
25ff0 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
26000 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
26010 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
26020 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
26030 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
26040 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
26050 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
26060 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
26070 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
26080 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
26090 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
260a0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
260b0 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  fl)!=0.     && p
260c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
260d0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a  ffset/ovflSize].
260e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64      ){.      iId
260f0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
26100 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
26110 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
26120 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
26130 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
26140 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
26150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
26160 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
26170 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
26180 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
26190 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
261a0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
261b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
261c0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
261d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
261e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
261f0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20  F_ValidOvfl)!=0 
26200 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
26210 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
26220 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
26230 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
26240 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26250 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
26270 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
26280 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
26290 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
262a0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
262b0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  }..      if( off
262c0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
262d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
262e0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
262f0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
26300 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
26310 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
26320 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
26330 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
26340 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
26350 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
26360 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
26370 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
26380 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
26390 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
263a0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
263b0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
263c0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
263d0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
263e0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
263f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
26400 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26410 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
26420 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
26430 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ray must be allo
26440 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f  cated because eO
26450 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  p!=2.        ** 
26460 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32  here.  If eOp==2
26470 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30  , then offset==0
26480 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68   and this branch
26490 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e   is never taken.
264a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
264b0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21      assert( eOp!
264c0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =2 );.        as
264d0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
264e0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
264f0 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
26500 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26510 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
26520 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
26530 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26540 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
26550 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26560 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
26570 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
26580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26590 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
265a0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
265b0 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
265c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
265d0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
265e0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
265f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26600 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
26610 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
26620 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
26630 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
26640 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
26650 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
26660 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
26670 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
26680 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
26690 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
266a0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
266b0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
266c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
266d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
266e0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
266f0 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
26700 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
26710 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
26720 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
26730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
26740 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
26750 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
26760 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
26770 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
26780 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
26790 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
267a0 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
267b0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
267c0 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
267d0 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
267e0 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
267f0 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
26800 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
26810 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
26820 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
26830 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
26840 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
26850 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
26860 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
26870 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
26880 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
26890 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
268a0 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
268b0 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
268c0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
268d0 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
268e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37  ..        **   7
268f0 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
26900 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
26910 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
26920 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
26930 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
26940 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
26950 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
26960 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
26970 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
26980 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
26990 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
269a0 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
269b0 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
269c0 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
269d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
269e0 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
269f0 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
26a00 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
26a10 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
26a20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
26a30 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a60 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
26a70 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
26ab0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
26ac0 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
26ad0 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
26b00 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
26b10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
26b20 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
26b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
26b40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26b50 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
26b60 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
26b70 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
26b80 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
26b90 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
26ba0 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
26bb0 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26bd0 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
26be0 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
26bf0 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20       /* (7) */. 
26c20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26c30 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
26c40 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
26c50 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
26c60 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
26c70 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
26c80 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a    /* hence (7) *
26cb0 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
26cc0 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
26cd0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
26cf0 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
26d00 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
26d10 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
26d20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
26d30 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
26d40 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
26d50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
26d60 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
26d70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
26d80 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
26d90 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
26da0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
26db0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26dc0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
26dd0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
26de0 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
26df0 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
26e00 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
26e10 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26e20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
26e30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26e40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26e50 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
26e60 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
26e70 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
26e80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26e90 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
26ea0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
26eb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26ec0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
26ed0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
26ee0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
26ef0 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
26f00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26f10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
26f20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26f30 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
26f40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
26f60 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
26f70 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
26f80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
26f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26fa0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
26fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26fc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26fd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
26ff0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
27000 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
27010 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
27020 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
27030 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
27040 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
27050 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
27060 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27070 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
27080 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27090 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
270a0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
270b0 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
270c0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
270d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
270e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
270f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
27100 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
27110 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
27120 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
27130 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
27140 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
27150 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
27160 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
27170 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
27180 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27190 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
271a0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
271b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
271c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
271d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
271e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
271f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
27200 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27210 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27220 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27230 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
27240 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27250 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27260 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27270 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
27280 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
27290 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
272a0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
272b0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
272c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
272d0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
272e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
272f0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
27300 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
27310 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
27320 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
27330 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
27340 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
27350 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
27360 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27370 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
27380 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
27390 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
273a0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
273b0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
273c0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
273d0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
273e0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
273f0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
27400 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
27410 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27420 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
27430 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
27440 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
27450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27460 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
27470 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27480 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
27490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
274a0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
274b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
274c0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
274d0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
274e0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
274f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27510 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
27520 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27530 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27540 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27550 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
27560 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27570 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
27580 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27590 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
275a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
275b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
275c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
275d0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
275e0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
275f0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
27600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27610 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
27620 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
27630 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
27640 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
27650 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
27660 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
27670 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
27680 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
27690 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
276a0 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
276b0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
276c0 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
276d0 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
276e0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
276f0 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
27700 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
27710 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
27720 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
27730 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
27740 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
27750 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
27760 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
27770 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
27780 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
27790 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
277a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
277b0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
277c0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
277d0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
277e0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
277f0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
27800 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
27810 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
27820 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
27830 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
27840 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
27850 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
27860 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
27870 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
27880 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
27890 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
278a0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
278b0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
278c0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
278d0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
278e0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
278f0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
27900 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
27910 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
27920 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
27930 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
27940 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
27950 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
27960 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
27970 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
27980 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
27990 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
279a0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
279b0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
279c0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
279d0 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
279e0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
279f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
27a00 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
27a10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
27a20 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
27a30 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
27a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
27a50 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
27a60 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
27a70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33   here */.){.  u3
27a80 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  2 amt;.  assert(
27a90 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
27aa0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
27ab0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27ac0 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
27ad0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27ae0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27af0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27b00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27b10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
27b20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
27b30 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
27b40 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
27b50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27b60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27b70 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27b80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27b90 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
27ba0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
27bb0 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
27bc0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
27bd0 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61  yload>pCur->apPa
27be0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27bf0 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
27c00 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
27c10 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
27c20 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61  yload<pCur->apPa
27c30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27c40 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
27c50 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
27c60 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50   (int)(pCur->apP
27c70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27c80 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
27c90 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27ca0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
27cb0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29  nfo.nLocal<amt )
27cc0 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66   amt = pCur->inf
27cd0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d  o.nLocal;.  *pAm
27ce0 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72  t = amt;.  retur
27cf0 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
27d00 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
27d10 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
27d20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
27d30 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
27d40 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
27d50 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
27d60 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
27d70 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
27d80 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
27d90 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
27da0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
27db0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27dc0 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
27dd0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
27de0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
27df0 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
27e00 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
27e10 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
27e20 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
27e30 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
27e40 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
27e50 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
27e60 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
27e70 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
27e80 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
27e90 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
27ea0 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
27eb0 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
27ec0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
27ed0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
27ee0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
27ef0 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
27f00 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
27f10 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
27f20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
27f30 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
27f40 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
27f50 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
27f60 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79  *sqlite3BtreePay
27f70 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73  loadFetch(BtCurs
27f80 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
27f90 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
27fa0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
27fb0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
27fc0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
27fd0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
27fe0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
27ff0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
28000 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
28010 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
28020 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
28030 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
28040 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
28050 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
28060 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
28070 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
28080 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
28090 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
280a0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
280b0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
280c0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
280d0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
280e0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
280f0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
28100 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
28110 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
28120 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
28130 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
28140 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
28150 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
28160 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
28170 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
28180 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28190 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
281a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
281b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
281c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
281d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
281e0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
281f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28200 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
28210 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
28220 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
28230 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
28240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
28250 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
28260 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
28270 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28280 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28290 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
282a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
282b0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
282c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
282d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a  ur->iPage] = 0;.
282e0 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49    return getAndI
282f0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
28300 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50  Pgno, &pCur->apP
28310 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28330 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20            pCur, 
28340 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
28350 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ags);.}..#if SQL
28360 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
28370 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
28380 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
28390 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
283a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
283b0 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
283c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
283d0 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
283e0 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
283f0 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
28400 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
28410 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
28420 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
28430 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
28440 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
28450 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
28460 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
28470 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
28480 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
28490 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
284a0 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
284b0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
284c0 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
284d0 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
284e0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
284f0 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
28500 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
28510 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
28520 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
28540 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
28550 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
28560 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
28570 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
28580 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
28590 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
285a0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
285b0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
285c0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
285d0 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
285e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
285f0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
28600 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
28610 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
28620 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
28630 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
28640 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
28650 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
28660 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28670 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
28680 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
28690 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
286a0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
286b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
286c0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
286d0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
286e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
286f0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
28700 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
28710 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
28720 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
28730 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
28740 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
28750 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
28760 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
28770 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
28780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28790 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
287a0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
287b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
287c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
287d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
287e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
287f0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
28800 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
28810 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
28820 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
28830 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
28840 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28850 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
28860 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28870 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
28880 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28890 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
288a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
288b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
288c0 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
288d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
288e0 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
288f0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
28900 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28910 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28920 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28930 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
28940 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
28950 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
28960 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
28970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
28980 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
28990 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
289a0 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
289b0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
289c0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
289d0 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
289e0 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
289f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
28a00 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
28a10 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
28a20 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
28a30 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
28a40 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
28a50 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
28a60 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
28a70 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
28a80 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
28a90 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
28aa0 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
28ab0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
28ac0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
28ad0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
28ae0 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
28af0 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
28b00 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
28b10 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
28b20 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
28b30 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
28b40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
28b50 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
28b60 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
28b70 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
28b80 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
28b90 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
28ba0 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
28bb0 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
28bc0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
28bd0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
28be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
28bf0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
28c00 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
28c10 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
28c20 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
28c30 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
28c40 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
28c50 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
28c60 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
28c70 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
28c80 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
28c90 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
28ca0 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
28cb0 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
28cc0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
28cd0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
28ce0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
28cf0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
28d00 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
28d10 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
28d20 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28d30 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
28d40 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
28d50 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
28d60 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
28d70 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
28d80 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
28d90 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
28da0 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
28db0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28dc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
28dd0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
28de0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
28df0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28e00 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
28e10 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
28e20 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
28e30 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
28e40 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
28e50 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
28e60 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28e70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28e80 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
28e90 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28ea0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
28eb0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
28ec0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
28ed0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28ee0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
28ef0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28f00 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
28f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28f20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
28f30 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
28f40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
28f50 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
28f60 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
28f70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
28f80 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
28f90 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
28fa0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28fb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28fc0 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e]!=0 );.      r
28fd0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
28fe0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
28ff0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
29000 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29010 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29020 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29030 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29040 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29070 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29080 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
29090 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
290a0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
290b0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
290c0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
290d0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
290f0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
29100 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29120 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
29130 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29140 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
29150 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29160 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
29170 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
29180 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
29190 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
291a0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
291b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
291c0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
291d0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
291e0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
291f0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
29200 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
29210 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
29220 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
29230 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
29240 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
29250 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
29260 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29270 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
29280 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
29290 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
292a0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
292b0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
292c0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
292d0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
292e0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
292f0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
29300 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
29310 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
29320 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
29330 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
29340 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
29350 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
29360 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29370 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
29380 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
29390 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
293a0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
293b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
293c0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
293d0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
293e0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
293f0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
29400 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
29410 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
29420 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
29430 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29440 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
29450 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
29460 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
29470 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
29480 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
29490 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
294a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
294b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
294c0 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
294d0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
294e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
294f0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
29500 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
29510 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
29520 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29530 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
29540 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
29550 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29560 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
29570 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
29580 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
29590 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
295a0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
295b0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
295c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
295d0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
295e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
295f0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
29600 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29610 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29620 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
29630 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
29640 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
29650 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29660 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29670 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29690 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
296a0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
296b0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
296c0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
296d0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
296e0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
296f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
29700 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
29710 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
29720 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
29730 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
29740 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
29750 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
29760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29770 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
29780 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29790 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
297a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
297b0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
297c0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
297d0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
297e0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
297f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29800 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29810 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
29820 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
29830 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29840 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29850 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
29860 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
29870 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29880 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29890 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
298a0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
298b0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
298c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
298d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
298e0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
298f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
29910 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
29920 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
29930 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
29940 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
29950 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
29960 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
29970 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
29980 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
29990 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
299a0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
299b0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
299c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
299d0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
299e0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
299f0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
29a00 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
29a10 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
29a20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
29a30 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
29a40 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
29a50 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
29a60 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
29a70 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
29a80 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
29a90 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
29aa0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
29ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
29ac0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
29ad0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29ae0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
29af0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29b00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
29b10 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
29b20 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29b30 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29b40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29b50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b60 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29b70 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
29b80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29b90 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
29ba0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
29bb0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
29bc0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29bd0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
29be0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29bf0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
29c00 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
29c10 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
29c20 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
29c30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
29c40 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
29c50 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
29c60 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
29c70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29c80 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
29c90 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
29ca0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29cb0 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
29cc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29cd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
29ce0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
29cf0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
29d00 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
29d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
29d20 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
29d30 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
29d40 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
29d50 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
29d60 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
29d70 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
29d80 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
29d90 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
29da0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
29db0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
29dc0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
29dd0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
29de0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29df0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29e00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29e10 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
29e20 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
29e30 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
29e40 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
29e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29e60 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
29e70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29e80 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
29e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29ea0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
29eb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29ec0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29ed0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29ee0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
29ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29f00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29f10 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
29f20 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29f30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
29f40 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29f50 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
29f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29f70 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
29f80 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
29f90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29fa0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29fb0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29fc0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29fd0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29fe0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29ff0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2a000 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2a010 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2a020 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2a030 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2a040 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2a050 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2a060 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2a070 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a080 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a090 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a0a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a0b0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a0c0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2a0d0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2a0e0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2a0f0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2a100 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2a110 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2a120 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2a130 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2a140 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a150 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2a160 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a170 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2a180 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2a190 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2a1a0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2a1b0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2a1c0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a1d0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2a1e0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2a1f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2a200 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2a210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2a220 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2a230 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2a240 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2a250 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2a260 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2a270 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
2a280 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a290 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
2a2a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2a2b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a2c0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
2a2d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2a2e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a2f0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2a300 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2a310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a320 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
2a330 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2a340 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2a350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2a360 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2a370 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a380 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2a390 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2a3a0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2a3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a3c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a3d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2a3e0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a3f0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2a400 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2a410 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a430 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a440 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2a450 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a460 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2a470 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2a480 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2a490 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2a4a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2a4b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a4c0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2a4d0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2a4e0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2a4f0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2a500 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2a510 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2a520 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2a530 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2a540 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2a550 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2a560 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2a570 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2a580 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2a590 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2a5a0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2a5b0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2a5c0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2a5d0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2a5e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a5f0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2a600 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2a610 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2a620 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2a630 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2a640 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2a650 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2a660 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2a670 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2a680 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2a690 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2a6a0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2a6b0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2a6c0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2a6d0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2a6e0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2a6f0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2a700 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2a710 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2a720 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2a730 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2a740 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2a750 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2a760 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2a770 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2a780 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2a790 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2a7a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2a7b0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2a7c0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a7d0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2a7e0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a800 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2a810 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2a820 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2a830 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2a840 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2a850 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a860 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a870 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a880 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2a890 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2a8a0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2a8b0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2a8c0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a8d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a8e0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a8f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a900 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2a910 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2a920 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2a930 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2a940 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2a950 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2a960 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2a970 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2a980 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2a990 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2a9a0 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2a9b0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2a9c0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2a9d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a9e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2a9f0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2aa00 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2aa10 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2aa20 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2aa30 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2aa40 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2aa50 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2aa60 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2aa70 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2aa80 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2aa90 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2aaa0 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2aab0 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2aad0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2aae0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2aaf0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2ab00 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2ab10 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2ab20 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ab30 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ab40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ab50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2ab60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2ab70 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2ab80 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2ab90 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2aba0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2abb0 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2abc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2abd0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2abe0 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2abf0 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2ac00 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2ac10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2ac20 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2ac30 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2ac40 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2ac50 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2ac60 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2ac70 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2ac80 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2ac90 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2aca0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2acb0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2acc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2acd0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2ace0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2acf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2ad00 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2ad10 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ad20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ad30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2ad40 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2ad50 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2ad60 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
2ad70 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2ad80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
2ad90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2ada0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2adb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2adc0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2add0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2ade0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2adf0 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2ae00 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2ae10 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2ae20 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2ae30 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2ae40 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2ae50 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2ae60 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2ae70 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2ae80 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2ae90 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2aea0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2aeb0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2aec0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2aed0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2aee0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2aef0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2af00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2af10 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2af20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2af30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2af40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2af50 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2af60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2af70 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2af80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2af90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2afa0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2afb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2afc0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2afd0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2afe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2aff0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2b000 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2b010 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2b020 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2b030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b040 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2b050 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b060 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2b070 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2b080 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2b090 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2b0a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b0b0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2b0c0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2b0d0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2b0e0 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2b0f0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2b100 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2b110 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b120 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b130 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b160 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2b170 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2b180 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2b190 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2b1a0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2b1b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2b1c0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2b1d0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2b1e0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2b1f0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2b200 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2b210 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2b220 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b230 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2b240 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2b250 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2b260 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2b270 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2b280 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2b290 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2b2a0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2b2b0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2b2c0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2b2d0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2b2e0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2b2f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2b300 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2b310 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2b320 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2b330 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2b340 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2b350 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b360 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2b370 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2b380 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2b390 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2b3a0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2b3b0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2b3c0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2b3d0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2b3e0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2b3f0 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2b400 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2b410 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2b420 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b430 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b440 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2b450 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2b460 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2b470 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2b480 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2b490 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2b4a0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2b4b0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2b4c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2b4d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2b4e0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2b4f0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2b500 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2b510 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2b520 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
2b530 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b540 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2b560 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2b570 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2b580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2b590 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2b5a0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2b5b0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2b5c0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2b5d0 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2b5e0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2b5f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2b600 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2b610 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2b620 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2b630 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2b640 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2b650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b660 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2b670 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2b680 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2b690 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2b6a0 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2b6b0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2b6c0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2b6d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2b6e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b6f0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2b700 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2b710 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b720 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2b730 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2b740 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2b750 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2b760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b770 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b780 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2b7a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b7b0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2b7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b7d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b7e0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2b7f0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2b800 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2b810 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2b820 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2b830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2b840 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2b850 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2b860 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2b870 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2b880 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2b890 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2b8a0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2b8b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2b8c0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2b8d0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2b8e0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2b8f0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2b900 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2b910 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2b920 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2b930 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2b940 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2b950 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2b960 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2b970 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2b980 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2b990 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2b9a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2b9b0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2b9c0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2b9d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2b9e0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2b9f0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2ba00 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2ba10 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2ba20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2ba30 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2ba40 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2ba50 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2ba60 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2ba70 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2ba80 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2ba90 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2baa0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2bab0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2bac0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2bad0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2bae0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2baf0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2bb00 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2bb10 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2bb20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2bb30 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2bb40 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2bb50 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2bb60 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2bb70 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2bb80 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2bb90 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2bba0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2bbb0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2bbc0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2bbd0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2bbe0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2bbf0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2bc00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bc10 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2bc20 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2bc30 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2bc40 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2bc50 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2bc60 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2bc70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bc80 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2bc90 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2bca0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2bcb0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2bcc0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2bcd0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2bce0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2bcf0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2bd00 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2bd10 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2bd20 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2bd30 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2bd40 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2bd50 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2bd60 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2bd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bd80 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2bd90 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2bda0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2bdb0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2bdc0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2bdd0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2bde0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2bdf0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2be00 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2be10 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2be20 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2be30 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2be40 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2be50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2be60 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2be70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2be80 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2be90 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2bea0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2beb0 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2bec0 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2bed0 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2bee0 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2bef0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2bf00 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2bf10 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2bf20 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2bf30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2bf40 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2bf50 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2bf60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2bf70 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2bf80 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2bf90 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2bfa0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2bfb0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2bfc0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2bfd0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2bfe0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2bff0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2c000 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2c010 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2c020 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2c030 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2c040 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2c050 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2c060 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c070 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2c080 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2c090 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2c0a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c0b0 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2c0c0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2c0d0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2c0e0 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2c0f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2c100 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2c110 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2c120 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2c130 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2c140 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2c150 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2c160 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2c170 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2c180 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2c190 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c1a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c1b0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2c1c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c1d0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c1e0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2c1f0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2c200 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2c210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c220 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2c230 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2c240 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c250 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c260 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c270 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c280 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2c290 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c2a0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c2b0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2c2c0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2c2d0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2c2e0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2c2f0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
2c300 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2c310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c320 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2c330 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c340 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c360 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2c370 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2c380 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2c390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c3a0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2c3b0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2c3c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2c3e0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2c3f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2c400 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2c410 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2c420 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2c430 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2c440 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2c450 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2c460 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2c470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2c480 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2c490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2c4b0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2c4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4d0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2c4e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2c4f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c500 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c510 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2c520 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c530 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c550 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c560 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2c570 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c580 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c590 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2c5a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2c5b0 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2c5c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2c5d0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2c5e0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2c5f0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2c600 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2c610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c620 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2c630 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2c640 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2c650 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2c660 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c670 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2c680 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c6a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c6b0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2c6c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c6d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2c6e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c6f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c700 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2c710 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2c720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c730 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c740 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2c750 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2c760 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2c770 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2c780 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2c790 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c7a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c7b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2c7c0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2c7d0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c7e0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2c7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2c800 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c810 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2c820 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c830 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2c840 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2c850 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2c860 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2c870 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2c880 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2c890 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2c8a0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2c8b0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2c8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2c8d0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2c8e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2c8f0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c900 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2c910 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2c920 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2c930 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2c940 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c950 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2c960 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2c970 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2c980 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c990 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2c9a0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2c9b0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2c9c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2c9d0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2c9e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c9f0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2ca00 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2ca10 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2ca20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2ca30 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2ca40 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2ca50 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2ca60 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2ca70 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2ca80 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2ca90 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2caa0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2cab0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2cac0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2cad0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2cae0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2caf0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2cb00 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2cb10 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2cb20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2cb30 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2cb40 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2cb50 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2cb60 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2cb70 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2cb80 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2cb90 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2cba0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2cbb0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2cbc0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2cbd0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2cbe0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2cbf0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2cc00 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2cc10 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2cc20 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2cc30 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2cc40 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2cc50 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2cc60 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2cc70 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2cc80 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2cc90 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2cca0 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2ccb0 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2ccc0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2ccd0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2cce0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2ccf0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2cd00 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2cd10 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2cd20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2cd30 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2cd40 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2cd50 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2cd60 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2cd70 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2cd80 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2cd90 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2cda0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2cdb0 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2cdc0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2cdd0 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2cde0 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2cdf0 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2ce00 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2ce10 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2ce20 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2ce30 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2ce40 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2ce50 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2ce60 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2ce70 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2ce80 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2ce90 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2cea0 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2ceb0 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2cec0 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2ced0 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2cee0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2cef0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2cf00 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2cf10 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2cf20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2cf30 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2cf40 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2cf50 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2cf60 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2cf70 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2cf80 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2cf90 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2cfa0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2cfb0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2cfc0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2cfd0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2cfe0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2cff0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2d000 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d010 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2d020 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2d030 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d040 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d050 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d060 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d070 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2d080 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2d090 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2d0a0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2d0b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d0c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d0d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d0e0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2d0f0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2d100 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2d110 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2d120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d130 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2d140 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2d150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d160 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d170 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2d180 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d190 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2d1a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d1b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2d1c0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2d1d0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2d1e0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d1f0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2d200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d210 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d220 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d230 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2d240 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d250 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d260 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2d270 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d280 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2d290 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d2a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2d2b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d2c0 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2d2d0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2d2e0 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2d2f0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2d300 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2d310 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2d320 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2d330 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2d340 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2d350 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2d360 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2d370 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2d380 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2d390 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2d3a0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2d3b0 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2d3c0 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2d3d0 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2d3e0 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2d3f0 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2d400 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2d410 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2d420 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2d430 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2d440 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d450 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2d460 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2d470 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2d480 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d490 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2d4a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d4b0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2d4c0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d4d0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2d4e0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2d4f0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2d500 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2d510 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2d520 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d530 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2d540 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d550 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d560 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2d570 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2d580 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d590 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d5a0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2d5b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d5c0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2d5d0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2d5e0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2d5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2d600 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2d610 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2d620 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2d630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d640 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2d650 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d670 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d680 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d690 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2d6a0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2d6b0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2d6c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2d6d0 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2d6e0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2d6f0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d700 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2d710 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2d720 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2d730 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2d740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d750 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2d760 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2d770 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2d780 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d790 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2d7a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d7b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2d7c0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2d7d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2d7e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d7f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2d800 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d810 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2d820 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d830 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d840 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2d850 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d860 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2d870 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2d880 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d890 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2d8a0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2d8b0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2d8c0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2d8d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d8e0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d8f0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d900 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d910 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2d920 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2d930 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2d940 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2d950 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2d960 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2d970 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2d980 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2d990 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2d9a0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2d9b0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2d9c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2d9d0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2d9e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2d9f0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2da00 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2da10 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2da20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2da30 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2da40 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2da50 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2da60 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2da70 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2da80 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2da90 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2daa0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2dab0 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2dac0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2dad0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2dae0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2daf0 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2db00 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2db10 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2db20 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2db30 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2db40 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2db50 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2db60 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2db70 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2db80 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2db90 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2dba0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2dbb0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2dbc0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2dbd0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2dbe0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2dbf0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2dc00 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2dc10 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2dc20 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2dc30 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2dc40 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2dc50 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2dc60 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2dc70 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2dc80 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2dc90 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2dca0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2dcb0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2dcc0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2dcd0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2dce0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2dcf0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2dd00 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2dd10 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dd20 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2dd30 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2dd40 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2dd50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2dd60 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2dd70 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2dd80 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2dd90 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2dda0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2ddb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2ddc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2ddd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2dde0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2ddf0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2de00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2de10 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2de20 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2de30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2de40 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2de50 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2de60 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2de70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2de80 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2de90 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2dea0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2deb0 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2dec0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ded0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2dee0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2def0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2df00 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2df10 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2df20 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2df30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2df40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2df50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2df60 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2df70 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2df80 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2df90 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2dfa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2dfb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2dfc0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2dfd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2dfe0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2dff0 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2e000 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2e010 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2e020 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2e030 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2e040 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2e050 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2e060 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2e070 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2e080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e0a0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e0b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2e0c0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e0d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e0e0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2e0f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2e100 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e110 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2e120 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2e130 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2e140 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2e150 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2e160 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2e170 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2e180 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e190 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2e1a0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2e1b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2e1c0 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2e1d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2e1e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2e1f0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2e200 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2e210 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2e220 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2e230 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2e240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e250 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2e260 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2e270 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2e280 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2e290 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2e2a0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2e2b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2e2c0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e2d0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2e2e0 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
2e2f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e300 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
2e310 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e320 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2e330 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e340 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2e350 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e360 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e370 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2e380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e3a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2e3b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2e3c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e3d0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2e3e0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2e3f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e400 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e410 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e420 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2e430 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2e440 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2e450 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e460 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2e470 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e480 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2e490 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2e4a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2e4b0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2e4c0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2e4d0 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2e4e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e4f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e500 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e510 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2e520 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e530 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2e540 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e550 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2e560 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2e570 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2e580 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2e590 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e5a0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2e5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e5c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2e5d0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2e5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e5f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2e600 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2e610 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2e620 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2e630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2e640 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2e650 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2e660 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2e670 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2e680 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2e690 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2e6a0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2e6b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2e6c0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2e6d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e6e0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2e6f0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2e700 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2e710 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2e720 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2e730 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2e740 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2e750 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2e760 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
2e770 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
2e780 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
2e790 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2e7a0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2e7b0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2e7c0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2e7d0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2e7e0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2e7f0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2e800 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2e810 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2e820 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2e830 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2e840 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2e850 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2e860 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2e870 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2e880 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2e890 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2e8a0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2e8b0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2e8c0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2e8d0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2e8e0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2e8f0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2e900 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2e910 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2e920 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2e930 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2e940 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2e950 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2e960 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2e970 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2e980 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2e990 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2e9a0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2e9b0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2e9c0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2e9d0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2e9e0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2e9f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2ea00 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2ea10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ea20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2ea30 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2ea40 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2ea50 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2ea60 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2ea70 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2ea80 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2ea90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2eaa0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2eab0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2eac0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2ead0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2eae0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2eaf0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2eb00 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2eb10 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2eb20 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2eb30 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2eb40 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2eb50 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2eb60 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2eb70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2eb80 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2eb90 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2eba0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ebb0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2ebc0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2ebd0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2ebe0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2ebf0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2ec00 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2ec10 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2ec20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2ec30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ec40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2ec50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ec60 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2ec70 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2ec80 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2ec90 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2eca0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2ecb0 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2ecc0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2ecd0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2ece0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2ecf0 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2ed00 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2ed10 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2ed20 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2ed30 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2ed40 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2ed50 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2ed60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2ed70 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2ed80 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2ed90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2eda0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2edb0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2edc0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2edd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ede0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2edf0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2ee00 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2ee10 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2ee20 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2ee30 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2ee40 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2ee50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2ee60 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2ee70 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2ee80 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2ee90 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2eea0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
2eeb0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
2eec0 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
2eed0 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
2eee0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
2eef0 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
2ef00 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2ef10 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
2ef20 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2ef30 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
2ef40 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2ef50 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
2ef60 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2ef70 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
2ef80 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
2ef90 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
2efa0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
2efb0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2efc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2efd0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
2efe0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2eff0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2f000 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
2f010 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2f020 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f030 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
2f040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2f050 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2f060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2f070 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
2f080 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
2f090 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f0a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f0b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
2f0c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2f0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
2f0e0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2f0f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f100 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
2f110 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2f120 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
2f130 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
2f140 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
2f150 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
2f160 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
2f170 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
2f180 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
2f190 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
2f1a0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2f1b0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
2f1c0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
2f1d0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2f1e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f1f0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2f200 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2f210 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
2f220 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2f230 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
2f240 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
2f250 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
2f260 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
2f270 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
2f280 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
2f290 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
2f2a0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
2f2b0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
2f2c0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
2f2d0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
2f2e0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
2f2f0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2f300 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2f310 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f320 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
2f330 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
2f340 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
2f350 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2f360 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
2f370 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
2f380 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
2f390 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
2f3a0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
2f3b0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2f3c0 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
2f3d0 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
2f3e0 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2f3f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2f400 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
2f410 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2f420 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
2f430 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2f440 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
2f450 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
2f460 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
2f470 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f480 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
2f490 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2f4a0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2f4b0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2f4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f4d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2f4e0 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
2f4f0 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2f500 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2f510 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
2f520 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
2f530 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2f540 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2f550 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
2f560 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
2f570 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
2f580 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
2f590 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2f5a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2f5b0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2f5c0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
2f5d0 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
2f5e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
2f5f0 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
2f600 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
2f610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f630 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2f640 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2f650 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f660 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2f670 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2f680 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f690 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2f6a0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2f6b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f6c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2f6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f6e0 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2f6f0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2f700 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2f710 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f720 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2f730 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2f740 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2f750 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2f760 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2f770 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2f780 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2f790 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2f7a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2f7b0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2f7c0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2f7d0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2f7e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2f7f0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2f800 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2f810 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2f820 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2f830 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2f840 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2f850 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2f860 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2f870 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2f880 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2f890 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2f8a0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2f8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f8c0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2f8d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f8e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f8f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f900 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f920 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2f930 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2f940 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2f950 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2f960 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2f970 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2f980 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2f990 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2f9a0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2f9b0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2f9c0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2f9d0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2f9e0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2f9f0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2fa00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2fa10 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2fa20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2fa30 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2fa40 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2fa50 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2fa60 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2fa70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2fa80 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fa90 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2faa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2fab0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2fac0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2fad0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2fae0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2faf0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2fb00 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2fb10 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2fb20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2fb30 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2fb40 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2fb50 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2fb60 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2fb70 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2fb80 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2fb90 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2fba0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2fbb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2fbc0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2fbd0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2fbe0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2fbf0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2fc00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fc10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2fc20 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2fc30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2fc40 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2fc50 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fc60 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2fc70 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2fc80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fc90 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2fca0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2fcb0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2fcc0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2fcd0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fce0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fcf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fd00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fd10 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2fd20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2fd30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fd40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fd50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fd60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fd70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fd80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fd90 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2fda0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2fdb0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fdc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fdd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fde0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2fdf0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2fe00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2fe10 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2fe20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2fe30 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2fe40 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2fe50 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2fe60 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2fe70 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2fe80 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2fe90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2fea0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2feb0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2fec0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2fed0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2fee0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2fef0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2ff00 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2ff10 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ff20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ff30 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2ff40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2ff50 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2ff60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2ff70 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2ff80 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2ff90 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2ffa0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2ffb0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2ffc0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2ffd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2ffe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fff0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30000 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30010 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
30020 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30030 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30040 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
30050 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
30060 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30080 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30090 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
300a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
300b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
300c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
300d0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
300e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
300f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30100 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30110 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
30120 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
30130 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
30140 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
30150 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
30160 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
30170 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
30180 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30190 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
301a0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
301b0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
301c0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
301d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
301e0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
301f0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
30200 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
30210 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
30220 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
30230 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30240 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30250 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30260 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
30270 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30280 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
30290 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
302a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
302b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
302c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
302d0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
302e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
302f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30310 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
30320 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
30330 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30340 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
30350 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
30360 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
30370 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
30380 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
30390 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
303a0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
303b0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
303c0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
303d0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
303e0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
303f0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
30400 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
30410 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
30420 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
30430 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
30440 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
30450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
30460 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
30470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
30480 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
30490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
304a0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
304b0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
304c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
304d0 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
304e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
304f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
30500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30550 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
30560 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
30570 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
30580 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
30590 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
305a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
305b0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
305c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
305d0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
305e0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
305f0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
30600 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
30610 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
30620 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
30630 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30640 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
30650 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
30670 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
306a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
306b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
306c0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
306d0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
306e0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
306f0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
30700 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
30710 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
30720 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
30730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30750 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30760 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30780 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
30790 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
307a0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
307b0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
307c0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
307d0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
307e0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
307f0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
30800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
30810 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
30820 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
30830 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
30840 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
30850 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
30860 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
30870 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
30880 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
30890 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308b0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
308c0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
308d0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
308e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
308f0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
30900 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
30920 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30930 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30940 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
30950 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
30960 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
30970 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
30980 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
30990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
309a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
309b0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
309c0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
309d0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
309e0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
309f0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
30a00 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
30a10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30a20 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
30a30 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
30a40 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
30a50 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
30a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30a80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30a90 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
30aa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30ab0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ad0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
30ae0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
30af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
30b00 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
30b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30b30 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
30b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b50 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
30b60 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
30b70 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
30b80 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
30b90 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
30ba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30bb0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
30bc0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
30bd0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
30be0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30bf0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30c00 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
30c10 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
30c20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
30c30 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
30c40 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
30c50 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
30c60 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
30c70 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
30c80 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
30c90 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
30ca0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
30cb0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
30cc0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
30cd0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
30ce0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
30cf0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
30d00 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
30d10 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
30d20 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
30d30 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
30d40 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
30d50 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
30d60 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
30d70 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
30d80 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
30d90 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
30da0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
30db0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
30dc0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
30dd0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
30de0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
30df0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
30e00 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
30e10 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
30e20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
30e30 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
30e40 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
30e50 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
30e60 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
30e70 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
30e80 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
30e90 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
30ea0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
30eb0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
30ec0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
30ed0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30ee0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
30ef0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
30f00 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
30f10 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
30f20 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
30f30 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
30f40 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
30f50 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
30f60 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
30f70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
30f80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30f90 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
30fa0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30fb0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
30fc0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
30fd0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
30fe0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
30ff0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
31000 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
31010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31020 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
31030 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
31040 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
31060 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
31070 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
31080 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31090 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
310a0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
310b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
310c0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
310d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
310e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
310f0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
31100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
31110 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
31120 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
31130 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
31140 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
31150 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
31160 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
31170 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
31180 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
31190 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
311a0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
311b0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
311c0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
311d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
311e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
311f0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
31200 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31210 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
31220 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
31230 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
31240 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
31250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31260 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
31270 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31280 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
31290 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
312a0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
312b0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
312c0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
312d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
312e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
312f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31300 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
31310 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31320 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
31330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
31340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31350 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
31360 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
31370 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
31380 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
31390 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
313a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
313b0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
313c0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
313d0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
313e0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
313f0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
31400 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
31410 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
31420 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31430 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31440 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
31450 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
31460 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
31470 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31480 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
31490 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
314a0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
314b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
314c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
314d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
314e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
314f0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
31500 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
31510 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
31520 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
31530 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
31540 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
31550 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31560 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
31570 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
31580 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
31590 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
315a0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
315b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
315c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
315d0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
315e0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
315f0 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
31600 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31610 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
31620 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
31630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31640 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
31650 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
31660 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
31670 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31680 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
31690 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
316a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
316b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
316c0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
316d0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
316e0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
316f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
31700 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
31710 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
31720 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
31730 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
31740 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
31750 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
31760 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
31770 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
31780 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
31790 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
317a0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
317b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
317c0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
317d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
317e0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
317f0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
31800 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
31810 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
31820 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
31830 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
31840 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
31850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
31860 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
31870 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
31880 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
31890 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
318a0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
318c0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
318d0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
318e0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
318f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31900 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
31910 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
31920 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
31930 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
31940 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
31950 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
31960 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
31970 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31990 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
319a0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
319b0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
319c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319e0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
319f0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
31a20 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
31a30 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
31a40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
31a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
31a60 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
31a70 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
31a80 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
31a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
31aa0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
31ab0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
31ac0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
31ad0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
31ae0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31af0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
31b00 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
31b10 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
31b20 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
31b30 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
31b40 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
31b50 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
31b60 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
31b70 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
31b80 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
31b90 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
31ba0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
31bb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31bc0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31bd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31be0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31bf0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
31c00 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31c10 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
31c20 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31c30 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
31c40 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
31c50 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
31c60 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
31c70 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
31c80 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
31c90 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
31ca0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
31cb0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
31cc0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
31cd0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
31ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
31cf0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
31d00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31d10 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31d20 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
31d30 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
31d40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31d50 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31d60 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
31d70 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31d80 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31d90 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
31da0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
31db0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
31dc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
31dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
31de0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
31df0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
31e00 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
31e10 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
31e20 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
31e30 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
31e40 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
31e50 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
31e60 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
31e70 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
31e80 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
31e90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
31ea0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
31eb0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
31ec0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
31ed0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
31ee0 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
31ef0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
31f00 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
31f10 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
31f20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
31f30 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
31f40 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
31f50 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
31f60 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
31f70 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
31f80 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
31f90 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
31fa0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
31fb0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
31fc0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
31fd0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
31fe0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
31ff0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
32000 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
32010 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
32020 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
32030 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
32040 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
32050 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
32060 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
32070 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
32080 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
32090 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
320a0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
320b0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
320c0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
320d0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
320e0 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
320f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32100 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
32110 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
32120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32130 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32140 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
32150 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
32160 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
32170 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
32180 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
32190 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
321a0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
321b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
321c0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
321d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
321e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
321f0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
32210 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
32220 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
32230 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
32240 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
32250 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
32260 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
32270 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
32280 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
32290 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
322a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
322b0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
322c0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
322d0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
322e0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
322f0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
32300 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
32310 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
32320 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
32330 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
32340 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
32350 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
32360 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
32370 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
32380 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
32390 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
323a0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
323b0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
323c0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
323d0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
323e0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
323f0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
32400 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
32410 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
32420 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
32430 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
32440 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
32450 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
32460 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
32470 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
32480 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
32490 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
324a0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
324b0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
324c0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
324d0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
324e0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
324f0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
32500 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
32510 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
32520 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
32530 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
32540 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
32550 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
32560 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
32570 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
32580 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
32590 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
325a0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
325b0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
325c0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
325d0 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
325e0 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
325f0 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
32600 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
32610 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32620 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
32630 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
32640 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
32650 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
32660 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
32670 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
32680 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
32690 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
326a0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
326b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
326c0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
326d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
326e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
326f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
32700 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
32710 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
32720 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
32730 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32740 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
32750 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
32760 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
32770 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32780 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
32790 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
327a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
327b0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
327c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
327d0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
327e0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
327f0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
32800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
32810 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32820 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
32830 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
32840 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
32850 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
32860 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
32880 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
32890 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
328a0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
328b0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
328c0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
328d0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
328e0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
328f0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
32900 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
32910 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
32920 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
32930 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
32940 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
32950 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
32960 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
32970 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32980 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
32990 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
329a0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
329b0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
329c0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
329d0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
329e0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
329f0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
32a00 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
32a10 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
32a20 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
32a30 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
32a40 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
32a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32a60 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
32a70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
32a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32a90 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
32aa0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
32ab0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
32ac0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
32ad0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
32ae0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
32af0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32b00 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
32b10 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
32b20 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
32b30 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
32b40 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
32b50 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
32b60 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
32b70 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
32b80 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
32b90 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
32ba0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
32bb0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
32bc0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
32bd0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
32be0 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
32bf0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
32c00 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
32c10 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
32c20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
32c30 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
32c40 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
32c50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
32c60 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
32c70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
32c80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
32c90 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
32ca0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
32cb0 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
32cc0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32cd0 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
32ce0 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
32cf0 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
32d00 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
32d10 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
32d20 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
32d30 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
32d40 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32d50 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
32d60 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
32d70 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
32d80 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
32d90 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32da0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
32db0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
32dc0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
32dd0 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
32de0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32df0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
32e00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
32e10 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
32e20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32e30 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
32e40 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
32e50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32e60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
32e70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
32e80 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
32e90 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
32ea0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
32eb0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
32ec0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
32ed0 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  cal==info.nPaylo
32ee0 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
32ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
32f00 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
32f10 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
32f20 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
32f30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
32f40 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31  ell+info.nSize-1
32f50 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
32f60 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
32f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32f80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32f90 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
32fa0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
32fb0 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
32fc0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
32fd0 65 28 70 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e  e(pCell + info.n
32fe0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73  Size - 4);.  ass
32ff0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
33000 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
33010 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
33020 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
33030 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
33040 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
33050 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
33060 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
33070 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
33080 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
33090 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
330a0 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f   && (info.nPaylo
330b0 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
330c0 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
330d0 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
330e0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
330f0 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
33100 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
33110 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
33120 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
33130 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
33140 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
33150 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
33160 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
33170 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
33180 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
33190 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
331a0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
331b0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
331c0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
331d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
331e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
331f0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
33200 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
33210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33220 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
33230 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
33240 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
33250 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
33260 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
33270 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
33280 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
332a0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
332b0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
332c0 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
332d0 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
332e0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
332f0 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
33300 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
33310 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
33320 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
33330 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
33340 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
33350 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
33360 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
33370 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
33380 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
33390 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
333a0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
333b0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
333c0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
333d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
333e0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
333f0 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
33400 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
33410 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
33420 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
33430 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
33440 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
33450 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
33460 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
33470 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
33480 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
33490 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
334a0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
334b0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
334c0 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
334d0 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
334e0 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
334f0 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
33500 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
33510 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
33520 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
33530 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
33540 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
33550 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
33560 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
33570 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
33580 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
33590 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
335a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
335b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
335c0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
335d0 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
335e0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
335f0 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
33600 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
33610 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
33620 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
33630 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33640 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
33650 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
33660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33670 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
33680 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
33690 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
336a0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
336b0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
336c0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
336d0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
336e0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
336f0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
33700 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
33710 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
33720 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
33730 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
33740 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
33750 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
33760 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
33770 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
33780 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
33790 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
337a0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
337b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
337c0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
337d0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
337e0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
337f0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
33800 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
33810 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
33820 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
33830 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
33840 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
33850 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
33860 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
33870 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
33880 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
33890 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
338a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
338b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
338c0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
338d0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
338e0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
338f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
33900 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
33910 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
33920 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70   BtreePayload *p
33930 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79  X,        /* Pay
33940 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20  load with which 
33950 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
33960 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
33970 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
33980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
33990 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
339a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
339b0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
339c0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
339d0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
339e0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
339f0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
33a00 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
33a10 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
33a20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33a30 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
33a40 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
33a50 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
33a60 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
33a70 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
33a80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
33a90 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
33aa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33ab0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
33ac0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
33ad0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
33ae0 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
33af0 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
33b00 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
33b10 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
33b20 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
33b30 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
33b40 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
33b50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
33b60 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
33b70 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
33b80 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
33b90 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
33ba0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
33bb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33bc0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
33bd0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33be0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
33bf0 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
33c00 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
33c10 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
33c20 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  y ){.    nPayloa
33c30 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20  d = pX->nData + 
33c40 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70  pX->nZero;.    p
33c50 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b  Src = pX->pData;
33c60 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e  .    nSrc = pX->
33c70 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  nData;.    asser
33c80 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
33c90 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49  Leaf ); /* fillI
33ca0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c  nCell() only cal
33cb0 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a  led for leaves *
33cc0 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  /.    nHeader +=
33cd0 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
33ce0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
33cf0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65  ayload);.    nHe
33d00 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33d10 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
33d20 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e  ], *(u64*)&pX->n
33d30 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
33d40 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
33d50 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
33d60 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29  && pX->pKey!=0 )
33d70 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61  ;.    nSrc = nPa
33d80 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d  yload = (int)pX-
33d90 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  >nKey;.    pSrc 
33da0 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20  = pX->pKey;.    
33db0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33dc0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
33dd0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
33de0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
33df0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
33e00 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79  ad */.  if( nPay
33e10 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
33e20 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
33e30 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
33e40 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
33e50 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
33e60 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
33e70 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
33e80 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
33e90 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
33ea0 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
33eb0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
33ec0 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
33ed0 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
33ee0 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
33ef0 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
33f00 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
33f10 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
33f20 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
33f30 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33f40 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
33f50 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33f60 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
33f70 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
33f80 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33f90 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
33fa0 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
33fb0 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
33fc0 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
33fd0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
33fe0 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
33ff0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
34000 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
34010 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
34020 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
34030 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
34040 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
34050 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
34060 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
34070 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
34080 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
34090 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
340a0 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
340b0 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
340c0 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
340d0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
340e0 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
340f0 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
34100 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
34120 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
34130 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
34140 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
34150 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
34160 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
34170 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
34180 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
34190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
341a0 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
341b0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
341c0 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
341d0 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
341e0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
341f0 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
34200 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
34210 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
34220 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
34230 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
34240 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
34250 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  ectly..  */.#if 
34260 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
34270 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
34280 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
34290 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
342a0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
342b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
342c0 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
342d0 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
342e0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
342f0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
34300 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
34310 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
34320 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
34330 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
34340 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
34350 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
34360 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
34370 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
34380 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
34390 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
343a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
343b0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
343c0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
343d0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
343e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
343f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34400 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
34410 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
34420 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
34430 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34440 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
34450 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34460 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
34470 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
34480 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
34490 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
344a0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
344b0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
344c0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
344d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
344e0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
344f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
34500 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
34510 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
34520 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
34530 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
34540 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
34550 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
34560 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
34570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
34580 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34590 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
345a0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
345b0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
345c0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
345d0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
345e0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
345f0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
34600 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
34610 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
34620 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
34630 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
34640 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
34650 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
34660 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
34670 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
34680 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
34690 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
346a0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
346b0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
346c0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
346d0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
346e0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
346f0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
34700 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
34710 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
34720 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
34730 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
34740 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
34750 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
34760 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
34770 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
34780 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
34790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
347a0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
347b0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
347c0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
347d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
347e0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
347f0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
34800 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
34810 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
34820 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34830 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34840 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
34850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
34860 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
34870 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
34880 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
34890 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
348a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
348b0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
348c0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
348d0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
348e0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
348f0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
34900 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
34910 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
34920 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
34930 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
34940 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
34950 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
34960 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34970 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
34980 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34990 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
349a0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
349b0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
349c0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
349d0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
349e0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
349f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
34a00 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
34a10 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
34a20 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
34a30 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34a40 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34a60 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34a70 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34a80 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34a90 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
34aa0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34ab0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
34ac0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
34ad0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
34ae0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
34af0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
34b00 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
34b10 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
34b20 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
34b30 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
34b40 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
34b50 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
34b60 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
34b70 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
34b80 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
34b90 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
34ba0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
34bb0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
34bc0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
34bd0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
34be0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
34bf0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
34c00 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
34c10 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
34c20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34c30 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34c50 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34c60 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
34c70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
34c80 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
34c90 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
34ca0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
34cb0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
34cc0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
34cd0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
34ce0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
34cf0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
34d00 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
34d10 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34d20 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34d30 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34d40 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34d50 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34d60 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
34d70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
34d80 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
34d90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
34da0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
34db0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
34dc0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
34dd0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
34de0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
34df0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
34e00 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
34e10 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
34e20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
34e30 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
34e40 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
34e50 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
34e60 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
34e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
34e90 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
34ea0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
34eb0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
34ec0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
34ed0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
34ee0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
34ef0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
34f00 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
34f10 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
34f20 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
34f30 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
34f40 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
34f50 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
34f60 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
34f70 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
34f80 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
34f90 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
34fa0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
34fb0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
34fc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
34fd0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
34fe0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
34ff0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
35000 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
35010 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
35020 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
35030 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
35040 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
35050 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
35060 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
35070 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
35080 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
35090 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
350a0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
350b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
350c0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
350d0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
350e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
350f0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
35100 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
35110 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
35120 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35130 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35140 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
35150 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
35160 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
35170 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
35180 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
35190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
351a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
351b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
351c0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
351d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
351e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
351f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
35200 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
35210 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
35220 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
35230 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
35240 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
35250 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
35260 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
35270 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
35280 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
35290 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
352a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
352b0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
352c0 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
352d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
352e0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
352f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
35300 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
35310 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35320 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
35330 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
35340 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
35350 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
35360 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
35370 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35380 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
35390 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
353a0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
353b0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
353c0 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
353d0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
353e0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
353f0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
35400 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35410 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
35420 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
35430 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35440 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
35450 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
35460 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
35470 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
35480 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
35490 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
354a0 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
354b0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
354c0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
354d0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
354e0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
354f0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
35500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
35510 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
35520 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
35530 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
35540 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
35550 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
35560 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
35570 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35580 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
35590 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
355a0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
355b0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
355c0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
355d0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
355e0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
355f0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
35600 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
35610 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
35620 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
35630 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
35640 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
35650 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
35660 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
35670 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
35680 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
35690 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
356a0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
356b0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
356c0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
356d0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
356e0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
356f0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
35700 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
35710 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  mented..**.** *p
35720 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54  RC must be SQLIT
35730 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72  E_OK when this r
35740 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
35760 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
35770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
35780 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
35790 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
357a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
357b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
357c0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
357d0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
357e0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
357f0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
35800 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
35810 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
35820 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
35830 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
35840 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
35850 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
35860 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
35870 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
35880 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
35890 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
358a0 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
358b0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
358c0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
358d0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
358e0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
358f0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
35900 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
35910 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
35920 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
35930 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
35940 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
35950 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
35960 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
35970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
35980 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
35990 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
359a0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
359b0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
359c0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b  e */.  u8 *pIns;
359d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
359e0 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e  point in pPage->
359f0 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65  aCellIdx[] where
35a00 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65   no cell inserte
35a10 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
35a20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRC==SQLITE_OK 
35a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  );.  assert( i>=
35a40 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
35a50 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
35a60 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
35a70 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
35a80 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
35a90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35aa0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
35ab0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
35ac0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
35ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35ae0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
35af0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
35b00 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35b10 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35b20 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
35b30 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
35b40 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35b60 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35b70 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
35b80 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
35b90 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
35ba0 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
35bb0 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
35bc0 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
35bd0 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
35be0 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
35bf0 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
35c00 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
35c10 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
35c20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
35c30 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
35c40 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
35c50 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
35c60 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
35c70 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
35c80 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
35c90 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
35ca0 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
35cb0 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
35cc0 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
35cd0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
35ce0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70  .  assert( sz==p
35cf0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
35d00 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
35d10 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
35d20 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
35d30 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
35d40 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
35d50 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
35d60 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
35d70 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
35d80 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
35d90 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
35da0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
35db0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
35dc0 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
35dd0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
35de0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
35df0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
35e00 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
35e10 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
35e20 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
35e30 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
35e40 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
35e50 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
35e60 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
35e70 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f  = (u16)i;..    /
35e80 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
35e90 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c  overflows occur,
35ea0 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   they are always
35eb0 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20   sequential and 
35ec0 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  in.    ** sorted
35ed0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e   order.  This in
35ee0 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62  variants arise b
35ef0 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20  ecause multiple 
35f00 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20  overflows can.  
35f10 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20    ** only occur 
35f20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
35f30 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
35f40 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
35f50 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  e during.    ** 
35f60 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74  balancing, and t
35f70 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20  he dividers are 
35f80 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72  adjacent and sor
35f90 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
35fa0 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
35fb0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35fc0 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20  1]<(u16)i ); /* 
35fd0 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72  Overflows in sor
35fe0 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
35ff0 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
36000 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66   i==pPage->aiOvf
36010 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a  l[j-1]+1 );   /*
36020 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73   Overflows are s
36030 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d  equential */.  }
36040 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
36050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36060 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36070 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36090 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
360a0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
360b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
360c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
360d0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
360e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
360f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
36100 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
36110 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
36120 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d  lOffset]==pPage-
36130 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20  >aCellIdx );.   
36140 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
36150 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
36160 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
36170 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
36180 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
36190 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
361a0 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
361b0 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
361c0 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a  wing properties.
361d0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
361e0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
361f0 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
36200 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20   idx >= 0 );.   
36210 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
36220 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
36230 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
36240 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  +2 || CORRUPT_DB
36250 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36260 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
36270 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36280 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
36290 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
362a0 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
362b0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
362c0 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
362d0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
362e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
362f0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
36300 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
36310 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65  Ins = pPage->aCe
36320 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20  llIdx + i*2;.   
36330 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c   memmove(pIns+2,
36340 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d   pIns, 2*(pPage-
36350 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20  >nCell - i));.  
36360 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c    put2byte(pIns,
36370 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65   idx);.    pPage
36380 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f  ->nCell++;.    /
36390 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
363a0 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  cell count */.  
363b0 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50    if( (++data[pP
363c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34  age->hdrOffset+4
363d0 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61  ])==0 ) data[pPa
363e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
363f0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
36400 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
36410 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
36420 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  3])==pPage->nCel
36430 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l );.#ifndef SQL
36440 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36450 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
36460 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
36470 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
36480 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
36490 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
364a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
364b0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
364c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
364d0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
364e0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
364f0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
36500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
36510 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
36520 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
36530 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
36540 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43    }.}../*.** A C
36550 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20  ellArray object 
36560 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65  contains a cache
36570 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64   of pointers and
36580 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20   sizes for a.** 
36590 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75  consecutive sequ
365a0 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68  ence of cells th
365b0 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64  at might be held
365c0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61 67   on multiple pag
365d0 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  es..*/.typedef s
365e0 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
365f0 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63  CellArray;.struc
36600 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20  t CellArray {.  
36610 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
36620 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36630 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
36640 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  Cell[] */.  MemP
36650 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20  age *pRef;      
36660 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
36670 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36680 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
36690 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
366a0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
366b0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
366c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
366d0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
366e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
366f0 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
36700 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65  Make sure the ce
36710 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c  ll sizes at idx,
36720 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78   idx+1, ..., idx
36730 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a  +N-1 have been.*
36740 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  * computed..*/.s
36750 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c  tatic void popul
36760 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c  ateCellCache(Cel
36770 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69  lArray *p, int i
36780 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  dx, int N){.  as
36790 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
367a0 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20  idx+N<=p->nCell 
367b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  );.  while( N>0 
367c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
367d0 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30  ->apCell[idx]!=0
367e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   );.    if( p->s
367f0 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b  zCell[idx]==0 ){
36800 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c  .      p->szCell
36810 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  [idx] = p->pRef-
36820 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
36830 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  ef, p->apCell[id
36840 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  x]);.    }else{.
36850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
36860 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20  RRUPT_DB ||.    
36870 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43            p->szC
36880 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65  ell[idx]==p->pRe
36890 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
368a0 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
368b0 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20  idx]) );.    }. 
368c0 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d     idx++;.    N-
368d0 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
368e0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
368f0 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65  of the Nth eleme
36900 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  nt of the cell a
36910 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53  rray.*/.static S
36920 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75  QLITE_NOINLINE u
36930 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  16 computeCellSi
36940 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  ze(CellArray *p,
36950 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36960 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e  t( N>=0 && N<p->
36970 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
36980 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d  t( p->szCell[N]=
36990 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c  =0 );.  p->szCel
369a0 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  l[N] = p->pRef->
369b0 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
369c0 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29  f, p->apCell[N])
369d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ;.  return p->sz
369e0 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69  Cell[N];.}.stati
369f0 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c  c u16 cachedCell
36a00 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
36a10 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
36a20 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
36a30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
36a40 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20   p->szCell[N] ) 
36a50 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
36a60 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f  [N];.  return co
36a70 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c  mputeCellSize(p,
36a80 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   N);.}../*.** Ar
36a90 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
36aa0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
36ab0 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70  o nCell b-tree p
36ac0 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a  age cells. The .
36ad0 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61  ** szCell[] arra
36ae0 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
36af0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
36b00 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  each cell. This 
36b10 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c  function.** repl
36b20 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aces the current
36b30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
36b40 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63  e pPg with the c
36b50 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
36b60 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a  ell.** array..**
36b70 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  .** Some of the 
36b80 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
36b90 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  ] may currently 
36ba0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67  be stored in pPg
36bb0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
36bc0 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20  on works around 
36bd0 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
36be0 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e  by this by makin
36bf0 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  g a copy of any 
36c00 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62  .** such cells b
36c10 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
36c20 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  g the page data.
36c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61  .**.** The MemPa
36c40 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  ge.nFree field i
36c50 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
36c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
36c70 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
36c80 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
36c90 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
36ca0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
36cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
36cc0 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d  buildPage(.  Mem
36cd0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36cf0 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
36d00 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
36d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
36d30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
36d40 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
36d50 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
36d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36d70 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
36d80 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36da0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
36db0 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
36dc0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
36dd0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  pPg->hdrOffset; 
36de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
36df0 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
36e00 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  pPg */.  u8 * co
36e10 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
36e20 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
36e30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
36e40 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
36e50 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62    const int usab
36e60 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
36e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
36e80 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
36e90 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65   = &aData[usable
36ea0 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  Size];.  int i;.
36eb0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
36ec0 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a   pPg->aCellIdx;.
36ed0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
36ee0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
36ef0 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
36f00 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74  ger);.  u8 *pDat
36f10 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79  a;..  i = get2by
36f20 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36f30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d  );.  memcpy(&pTm
36f40 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c  p[i], &aData[i],
36f50 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29   usableSize - i)
36f60 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e  ;..  pData = pEn
36f70 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  d;.  for(i=0; i<
36f80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
36f90 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
36fa0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
36fb0 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43  SQLITE_WITHIN(pC
36fc0 65 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64 29 20  ell,aData,pEnd) 
36fd0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  ){.      pCell =
36fe0 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61   &pTmp[pCell - a
36ff0 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Data];.    }.   
37000 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c   pData -= szCell
37010 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
37020 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61  e(pCellptr, (pDa
37030 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ta - aData));.  
37040 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
37050 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 3c  .    if( pData <
37060 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75   pCellptr ) retu
37070 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
37080 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63  T_BKPT;.    memc
37090 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c  py(pData, pCell,
370a0 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   szCell[i]);.   
370b0 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b   assert( szCell[
370c0 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69  i]==pPg->xCellSi
370d0 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c  ze(pPg, pCell) |
370e0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
370f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a      testcase( sz
37100 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43  Cell[i]!=pPg->xC
37110 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c  ellSize(pPg,pCel
37120 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  l) );.  }..  /* 
37130 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
37140 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20  ield is now set 
37150 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65  incorrectly. The
37160 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78   caller will fix
37170 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e   it. */.  pPg->n
37180 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  Cell = nCell;.  
37190 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  pPg->nOverflow =
371a0 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28   0;..  put2byte(
371b0 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  &aData[hdr+1], 0
371c0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
371d0 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67  Data[hdr+3], pPg
371e0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  ->nCell);.  put2
371f0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
37200 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74  5], pData - aDat
37210 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b  a);.  aData[hdr+
37220 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74  7] = 0x00;.  ret
37230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37240 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
37250 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
37260 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
37270 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
37280 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20  Array szCell.** 
37290 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
372a0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
372b0 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
372c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
372d0 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20  mpts to .** add 
372e0 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64  the cells stored
372f0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f   in the array to
37300 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74   page pPg. If it
37310 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65   cannot (because
37320 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65   .** the page ne
37330 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67  eds to be defrag
37340 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68  mented before th
37350 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74  e cells will fit
37360 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  ), non-zero.** i
37370 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
37380 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65  rwise, if the ce
37390 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75  lls are added su
373a0 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f  ccessfully, zero
373b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
373c0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
373d0 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20  pCellptr points 
373e0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
373f0 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  ry in the cell-p
37400 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20  ointer array.** 
37410 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50  (part of page pP
37420 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20  g) to populate. 
37430 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c  After cell apCel
37440 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20  l[0] is written 
37450 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62  to the.** page b
37460 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66  ody, a 16-bit of
37470 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20  fset is written 
37480 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64  to pCellptr. And
37490 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68   so on, for each
374a0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  .** cell in the 
374b0 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65  array. It is the
374c0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
374d0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
374e0 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20   ensure.** that 
374f0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
37500 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72  erwrite this par
37510 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f  t of the cell-po
37520 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a  inter array..**.
37530 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
37540 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
37550 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20   *ppData points 
37560 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37570 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  the .** content 
37580 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67  area on page pPg
37590 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
375a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
375b0 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a  a is extended,.*
375c0 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64  * *ppData is upd
375d0 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ated to point to
375e0 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f   the new start o
375f0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
37600 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  ea.** before ret
37610 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69  urning..**.** Fi
37620 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20  nally, argument 
37630 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f  pBegin points to
37640 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
37650 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
37660 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
37670 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
37680 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f   by this page fo
37690 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  r the cell-point
376a0 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20  er area (for.** 
376b0 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20  all cells - not 
376c0 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72  just those inser
376d0 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ted by the curre
376e0 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65  nt call). If the
376f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61   content.** area
37700 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65   must be extende
37710 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73  d to before this
37720 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
37730 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c  to accomodate al
37740 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70  l.** cells in ap
37750 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65  Cell[], then the
37760 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69   cells do not fi
37770 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  t and non-zero i
37780 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
37790 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
377a0 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d  sertArray(.  Mem
377b0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
377d0 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c  Page to add cell
377e0 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42  s to */.  u8 *pB
377f0 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  egin,           
37800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
37810 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   of cell-pointer
37820 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a   array */.  u8 *
37830 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20  *ppData,        
37840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37850 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74  N/OUT: Page cont
37860 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65  ent -area pointe
37870 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
37880 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
37890 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
378a0 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  r to cell-pointe
378b0 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  r area */.  int 
378c0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
378d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
378e0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
378f0 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  ll to add */.  i
37900 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37920 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
37930 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20  s to add to pPg 
37940 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a  */.  CellArray *
37950 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20  pCArray         
37960 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
37970 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
37980 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74  nt i;.  u8 *aDat
37990 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
379a0 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70    u8 *pData = *p
379b0 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e  pData;.  int iEn
379c0 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65  d = iFirst + nCe
379d0 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f  ll;.  assert( CO
379e0 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d  RRUPT_DB || pPg-
379f0 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
37a00 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
37a10 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f  led on page 1 */
37a20 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
37a30 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
37a40 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20     int sz, rc;. 
37a50 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20     u8 *pSlot;.  
37a60 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c    sz = cachedCel
37a70 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69  lSize(pCArray, i
37a80 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61 74  );.    if( (aDat
37a90 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61  a[1]==0 && aData
37aa0 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f  [2]==0) || (pSlo
37ab0 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  t = pageFindSlot
37ac0 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30  (pPg,sz,&rc))==0
37ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
37ae0 44 61 74 61 20 2d 20 70 42 65 67 69 6e 29 3c 73  Data - pBegin)<s
37af0 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  z ) return 1;.  
37b00 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b      pData -= sz;
37b10 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70  .      pSlot = p
37b20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
37b30 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20 70 43 41  /* pSlot and pCA
37b40 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20  rray->apCell[i] 
37b50 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c  will never overl
37b60 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ap on a well-for
37b70 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  med.    ** datab
37b80 61 73 65 2e 20 20 42 75 74 20 74 68 65 79 20 6d  ase.  But they m
37b90 69 67 68 74 20 66 6f 72 20 61 20 63 6f 72 72 75  ight for a corru
37ba0 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 48 65  pt database.  He
37bb0 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28  nce use memmove(
37bc0 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d  ).    ** since m
37bd0 65 6d 63 70 79 28 29 20 73 65 6e 64 73 20 53 49  emcpy() sends SI
37be0 47 41 42 4f 52 54 20 77 69 74 68 20 6f 76 65 72  GABORT with over
37bf0 6c 61 70 70 69 6e 67 20 62 75 66 66 65 72 73 20  lapping buffers 
37c00 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20  on OpenBSD */.  
37c10 20 20 61 73 73 65 72 74 28 20 28 70 53 6c 6f 74    assert( (pSlot
37c20 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61  +sz)<=pCArray->a
37c30 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20  pCell[i].       
37c40 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41    || pSlot>=(pCA
37c50 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b  rray->apCell[i]+
37c60 73 7a 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  sz).         || 
37c70 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
37c80 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c    memmove(pSlot,
37c90 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37ca0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75  [i], sz);.    pu
37cb0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
37cc0 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29   (pSlot - aData)
37cd0 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
37ce0 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  += 2;.  }.  *ppD
37cf0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72  ata = pData;.  r
37d00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
37d10 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37d20 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
37d30 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
37d40 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
37d50 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61  szCell .** conta
37d60 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
37d70 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
37d80 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
37d90 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a  nction adds the.
37da0 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61  ** space associa
37db0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65  ted with each ce
37dc0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ll in the array 
37dd0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
37de0 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74  y stored .** wit
37df0 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20  hin the body of 
37e00 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66  pPg to the pPg f
37e10 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65  ree-list. The ce
37e20 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll-pointers and 
37e30 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20  other.** fields 
37e40 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20  of the page are 
37e50 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  not updated..**.
37e60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37e70 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
37e80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
37e90 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ls added to the 
37ea0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free-list..*/.st
37eb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65  atic int pageFre
37ec0 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  eArray(.  MemPag
37ed0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37ef0 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69  e to edit */.  i
37f00 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
37f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f20 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  * First cell to 
37f30 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
37f40 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
37f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
37f60 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ells to delete *
37f70 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
37f80 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
37f90 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
37fa0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  cells */.){.  u8
37fb0 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37fc0 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37fd0 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
37fe0 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74   &aData[pPg->pBt
37ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
38000 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61   u8 * const pSta
38010 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  rt = &aData[pPg-
38020 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b  >hdrOffset + 8 +
38030 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69   pPg->childPtrSi
38040 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20  ze];.  int nRet 
38050 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
38060 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73  int iEnd = iFirs
38070 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  t + nCell;.  u8 
38080 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e  *pFree = 0;.  in
38090 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20  t szFree = 0;.. 
380a0 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69   for(i=iFirst; i
380b0 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <iEnd; i++){.   
380c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41   u8 *pCell = pCA
380d0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b  rray->apCell[i];
380e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
380f0 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53  WITHIN(pCell, pS
38100 74 61 72 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20  tart, pEnd) ){. 
38110 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
38120 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
38130 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c 53   use cachedCellS
38140 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68 65  ize() here.  The
38150 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65   sizes of all ce
38160 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lls that.      *
38170 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65 65  * are to be free
38180 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
38190 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77 68  een computing wh
381a0 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68 69  ile deciding whi
381b0 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  ch.      ** cell
381c0 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20 2a  s need freeing *
381d0 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43 41  /.      sz = pCA
381e0 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b  rray->szCell[i];
381f0 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20 29    assert( sz>0 )
38200 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
38210 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
38220 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
38230 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
38240 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
38250 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
38260 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
38270 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
38280 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
38290 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
382a0 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
382b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
382c0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
382d0 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
382e0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
382f0 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
38300 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
38310 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
38320 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
38330 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
38340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
38350 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
38360 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
38370 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
38380 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
38390 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
383a0 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
383b0 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
383c0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
383d0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
383e0 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
383f0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
38400 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
38410 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
38420 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
38430 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
38440 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
38450 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
38460 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
38470 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
38480 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
38490 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
384a0 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
384b0 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
384c0 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
384d0 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
384e0 20 61 70 43 65 6c 6c 5b 69 4e 6