/ Hex Artifact Content
Login

Artifact 203c72f7967fcc913a9666f3229e340cac0fbbfa1c3793806dbd14261ecb9428:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  , b) 0.#endif../
0f60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0f70: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
0f80: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 29  E_CORRUPT_PAGE()
0f90: 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 61 20   macro. Takes a 
0fa0: 73 69 6e 67 6c 65 0a 2a 2a 20 28 4d 65 6d 50 61  single.** (MemPa
0fb0: 67 65 2a 29 20 61 73 20 61 6e 20 61 72 67 75 6d  ge*) as an argum
0fc0: 65 6e 74 2e 20 54 68 65 20 28 4d 65 6d 50 61 67  ent. The (MemPag
0fd0: 65 2a 29 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  e*) must not be 
0fe0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  NULL..**.** If S
0ff0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 6e  QLITE_DEBUG is n
1000: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
1010: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 65   this macro is e
1020: 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20  quivalent to.** 
1030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1040: 4b 50 54 2e 20 4f 72 2c 20 69 66 20 53 51 4c 49  KPT. Or, if SQLI
1050: 54 45 5f 44 45 42 55 47 20 69 73 20 73 65 74 2c  TE_DEBUG is set,
1060: 20 74 68 65 6e 20 74 68 65 20 6c 6f 67 20 6d 65   then the log me
1070: 73 73 61 67 65 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  ssage.** normall
1080: 79 20 70 72 6f 64 75 63 65 64 20 61 73 20 61 20  y produced as a 
1090: 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 53  side-effect of S
10a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10b0: 50 54 20 69 73 20 61 75 67 6d 65 6e 74 65 64 0a  PT is augmented.
10c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
10d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 66 69 6c 65   number and file
10e0: 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
10f0: 77 69 74 68 20 74 68 65 20 28 4d 65 6d 50 61 67  with the (MemPag
1100: 65 2a 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e*)..*/.#ifdef S
1110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1120: 63 6f 72 72 75 70 74 50 61 67 65 45 72 72 6f 72  corruptPageError
1130: 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 4d 65 6d  (int lineno, Mem
1140: 50 61 67 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  Page *p){.  char
1150: 20 2a 7a 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65   *zMsg;.  sqlite
1160: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1170: 6f 63 28 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  oc();.  zMsg = s
1180: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1190: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a0: 69 6f 6e 20 70 61 67 65 20 25 64 20 6f 66 20 25  ion page %d of %
11b0: 73 22 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  s",.      (int)p
11c0: 2d 3e 70 67 6e 6f 2c 20 73 71 6c 69 74 65 33 50  ->pgno, sqlite3P
11d0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
11e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 0a  pBt->pPager, 0).
11f0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e    );.  sqlite3En
1200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1210: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
1220: 20 20 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74     sqlite3Report
1230: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1240: 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d  RUPT, lineno, zM
1250: 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
1260: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 23  ORRUPT_BKPT;.}.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43   define SQLITE_C
12a0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d 65 6d  ORRUPT_PAGE(pMem
12b0: 50 61 67 65 29 20 63 6f 72 72 75 70 74 50 61 67  Page) corruptPag
12c0: 65 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 2c  eError(__LINE__,
12d0: 20 70 4d 65 6d 50 61 67 65 29 0a 23 65 6c 73 65   pMemPage).#else
12e0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12f0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d  _CORRUPT_PAGE(pM
1300: 65 6d 50 61 67 65 29 20 53 51 4c 49 54 45 5f 43  emPage) SQLITE_C
1310: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 4d 65 6d  ORRUPT_PGNO(pMem
1320: 50 61 67 65 2d 3e 70 67 6e 6f 29 0a 23 65 6e 64  Page->pgno).#end
1330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c  ACHE..#ifdef SQL
1360: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1380: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1390: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
13a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  t() statement. *
13b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  **.**.** Check t
13c0: 6f 20 73 65 65 20 69 66 20 70 42 74 72 65 65 20  o see if pBtree 
13d0: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
13e0: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
13f0: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
1400: 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74 68 20   .** table with 
1410: 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e  root page iRoot.
1420: 20 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69     Return 1 if i
1430: 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
1440: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  not..**.** For e
1450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
1460: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1470: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1480: 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72  Root via .** Btr
1490: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42  ee connection pB
14a0: 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  tree:.**.**    a
14b0: 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
14c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14d0: 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c  Btree, iRoot, 0,
14e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a   WRITE_LOCK) );.
14f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69  **.** When writi
1500: 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 74  ng to an index t
1510: 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 61  hat resides in a
1520: 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 61   sharable databa
1530: 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  se, the .** call
1540: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  er should have f
1550: 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20  irst obtained a 
1560: 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20  lock specifying 
1570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1580: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
1590: 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54 68 69  nding table. Thi
15a0: 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 61  s makes things a
15b0: 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   bit more compli
15c0: 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74 68 69  cated,.** as thi
15d0: 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74 73 20  s module treats 
15e0: 65 61 63 68 20 74 61 62 6c 65 20 61 73 20 61 20  each table as a 
15f0: 73 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75  separate structu
1600: 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69 6e 65  re. To determine
1610: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f  .** the table co
1620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 77  he index being w
1640: 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a 2a 20  ritten, this.** 
1650: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
1660: 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74  search through t
1670: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1680: 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ma..**.** Instea
1690: 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  d of a lock on t
16a0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 72  he table/index r
16b0: 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52  ooted at page iR
16c0: 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  oot, the caller 
16d0: 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72  may.** hold a wr
16e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f  schema table (ro
1700: 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73  ot page 1). This
1710: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65   is also.** acce
1720: 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ptable..*/.stati
1730: 63 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43  c int hasSharedC
1740: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20  acheTableLock(. 
1750: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
1760: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1770: 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64  e that must hold
1780: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20   lock */.  Pgno 
1790: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
17a0: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b0: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  f b-tree */.  in
17c0: 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20  t isIndex,      
17d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17e0: 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  iRoot is the roo
17f0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d  t of an index b-
1800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  tree */.  int eL
1810: 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20  ockType         
1820: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63   /* Required loc
1830: 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43  k type (READ_LOC
1840: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1850: 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20   */.){.  Schema 
1860: 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65  *pSchema = (Sche
1870: 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74  ma *)pBtree->pBt
1880: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e  ->pSchema;.  Pgn
1890: 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74  o iTab = 0;.  Bt
18a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  Lock *pLock;..  
18b0: 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
18c0: 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61 72 65  ase is not share
18d0: 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68 65 20  able, or if the 
18e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
18f0: 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73 20 74  g.  ** and has t
1900: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1910: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1920: 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65  en no lock is re
1930: 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20 52 65  quired. .  ** Re
1940: 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65 64 69  turn true immedi
1950: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
1960: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1970: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1980: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1990: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
19a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
19c0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
19d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
19e0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
19f0: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1a00: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1a10: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
1a20: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
1a30: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
1a40: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
1a50: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
1a60: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
1a70: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1a80: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1a90: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1aa0: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1ab0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1ac0: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1ad0: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1ae0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1af0: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1b00: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1b10: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
1b20: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1b30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b40: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b50: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
1b60: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
1b70: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1b80: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1b90: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1ba0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1bb0: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1bc0: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1bd0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1be0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1bf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1c00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1c10: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1c20: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1c30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1c40: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
1c50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
1c60: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
1c70: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1c80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1c90: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1ca0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1cb0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1cd0: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1cf0: 20 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   iTab ){.       
1d00: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
1d10: 65 20 69 6e 64 65 78 65 73 20 73 68 61 72 65 20  e indexes share 
1d20: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d30: 67 65 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a  ge.  There must.
1d40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1d50: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d60: 20 20 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e    So just return
1d70: 20 74 72 75 65 2e 20 20 54 68 65 20 61 73 73 65   true.  The asse
1d80: 72 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  rt is not.      
1d90: 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
1da0: 20 74 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20   that case. */. 
1db0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1dd0: 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78       iTab = pIdx
1de0: 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a  ->pTable->tnum;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20  }else{.    iTab 
1e10: 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20  = iRoot;.  }..  
1e20: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
1e30: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1e40: 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d   Either a write-
1e50: 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67  lock on root-pag
1e60: 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20  e iTab, a .  ** 
1e70: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1e80: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  e schema table, 
1e90: 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e  or (if the clien
1ea0: 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a  t is reading) a.
1eb0: 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f    ** read-lock o
1ec0: 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66  n iTab will suff
1ed0: 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66  ice. Return 1 if
1ee0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72   any of these ar
1ef0: 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66  e found.  */.  f
1f00: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d  or(pLock=pBtree-
1f10: 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  >pBt->pLock; pLo
1f20: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
1f30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1f40: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1f50: 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20  pBtree .     && 
1f60: 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d  (pLock->iTable==
1f70: 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e  iTab || (pLock->
1f80: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f90: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  K && pLock->iTab
1fa0: 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20  le==1)).     && 
1fb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  pLock->eLock>=eL
1fc0: 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a  ockType .    ){.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff0: 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74  Failed to find t
2000: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
2010: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
2020: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2030: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
2040: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2050: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
2060: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
2070: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
2080: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2090: 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a  ts only. ****.**
20a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20b0: 69 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  if it would be i
20c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65  llegal for pBtre
20d0: 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
20e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20f0: 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20  index rooted at 
2100: 69 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74  iRoot because ot
2110: 68 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  her shared conne
2120: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69  ctions are.** si
2130: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61  multaneously rea
2140: 64 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74  ding that same t
2150: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
2160: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2170: 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f  al for pBtree to
2180: 20 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f   write if some o
2190: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
21a0: 74 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73  t that.** shares
21b0: 20 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72   the same BtShar
21c0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72  ed object is cur
21d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
21e0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  r writing.** the
21f0: 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45   iRoot table.  E
2200: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74  xcept, if the ot
2210: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
2220: 20 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64   has the.** read
2230: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2240: 67 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  g set, then it i
2250: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68  s OK for the oth
2260: 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  er object to.** 
2270: 68 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73  have a read curs
2280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  or..**.** For ex
2290: 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72  ample, before wr
22a0: 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72  iting to any par
22b0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  t of the table o
22c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65  r index.** roote
22d0: 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c  d at page iRoot,
22e0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c   one should call
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
2300: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
2310: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
2320: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
2330: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
2340: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
2350: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
2360: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2370: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
2380: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
2390: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
23a0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
23b0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
23c0: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
23d0: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
23e0: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
23f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2400: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a 20 20 20  eadUncommit).   
2410: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2420: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
2440: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
2450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2460: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
2470: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
2480: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
2490: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24a0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
24b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
24c0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
24d0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
24e0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
24f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2500: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
2510: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
2520: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
2530: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
2540: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
2550: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
2560: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
2570: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2580: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2590: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
25a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
25b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
25c0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
25d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25e0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
25f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2600: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2610: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2620: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2630: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
2640: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
2650: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2660: 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c 6f  adUncommit)||eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
2680: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
2690: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
26a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
26b0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
26c0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
26d0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
26e0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
26f0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
2700: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
2710: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
2720: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
2730: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
2740: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
2750: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2760: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2770: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
2780: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
2790: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27a0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
27b0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
27c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
27d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27e0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
27f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2800: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
2810: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
2820: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
2830: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2840: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2860: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
2870: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2880: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
2890: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
28a0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
28b0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
28c0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
28d0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
28e0: 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d  iter!=p && (pBt-
28f0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2900: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b  EXCLUSIVE)!=0 ){
2910: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
2920: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
2930: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
2940: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
2950: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2960: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2970: 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  }..  for(pIter=p
2980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
2990: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
29a0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Next){.    /* Th
29b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74  e condition (pIt
29c0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
29d0: 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ) in the followi
29e0: 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20  ng if(...) .    
29f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ** statement is 
2a00: 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  a simplification
2a10: 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2a20: 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49  **   (eLock==WRI
2a30: 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  TE_LOCK || pIter
2a40: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
2a50: 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  OCK).    **.    
2a60: 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2a70: 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d   that if eLock==
2a80: 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e  WRITE_LOCK, then
2a90: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2aa0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20  tion.    ** may 
2ab0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2ac0: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2ad0: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2ae0: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2af0: 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69   ** only be a si
2b00: 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20  ngle writer)..  
2b10: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b20: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
2b30: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
2b40: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2b50: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
2b60: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b70: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70  LOCK || pIter->p
2b80: 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65  Btree==p || pIte
2b90: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2ba0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49  OCK);.    if( pI
2bb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
2bc0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
2bd0: 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e  =iTab && pIter->
2be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a  eLock!=eLock ){.
2bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2c00: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2c10: 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74  ->db, pIter->pBt
2c20: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
2c30: 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  if( eLock==WRITE
2c40: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
2c50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
2c60: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
2c70: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
2c80: 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47  s |= BTS_PENDING
2c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cb0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
2cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2d20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2d30: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
2d40: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2d50: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
2d60: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
2d70: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
2d80: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
2d90: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
2da0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
2db0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
2dc0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
2dd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2de0: 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sumes the follow
2df0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29  ing:.**.**   (a)
2e00: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42   The specified B
2e10: 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73  tree object p is
2e20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
2e30: 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20  sharable.**     
2e40: 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20    database (one 
2e50: 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65  with the BtShare
2e60: 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20  d.sharable flag 
2e70: 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  set), and.**.** 
2e80: 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42    (b) No other B
2e90: 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c  tree objects hol
2ea0: 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f  d a lock that co
2eb0: 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20  nflicts.**      
2ec0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2ed0: 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71  ted lock (i.e. q
2ee0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2ef0: 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a  ableLock() has.*
2f00: 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  *       already 
2f10: 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20  been called and 
2f20: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
2f30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OK)..**.** SQLIT
2f40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f50: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
2f60: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
2f70: 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ly. SQLITE_NOMEM
2f80: 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64   .** is returned
2f90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74   if a malloc att
2fa0: 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  empt fails..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
2fc0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2fd0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2fe0: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
2ff0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
3000: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
3010: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3020: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
3030: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
3040: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3050: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
3060: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
3070: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
3080: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
3090: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
30a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e  0 );..  /* A con
30b0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  nection with the
30c0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
30d0: 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20  d flag set will 
30e0: 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a  never try to.  *
30f0: 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d  * obtain a read-
3100: 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20  lock using this 
3110: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e  function. The on
3120: 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74  ly read-lock obt
3130: 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  ained.  ** by a 
3140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65  connection in re
3150: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d  ad-uncommitted m
3160: 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71  ode is on the sq
3170: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a  lite_master .  *
3180: 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61  * table, and tha
3190: 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  t lock is obtain
31a0: 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e  ed in BtreeBegin
31b0: 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61  Trans().  */.  a
31c0: 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62  ssert( 0==(p->db
31d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
31e0: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c 20  eadUncommit) || 
31f0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3200: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
3210: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3220: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
3230: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
3240: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
3250: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
3260: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
3270: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
3280: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
3290: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
32a0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
32b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
32c0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
32d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
32e0: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
32f0: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
3300: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
3310: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
3320: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
3330: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3340: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
3350: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
3360: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
3370: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
3380: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
3390: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
33a0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
33b0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
33c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
33d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
33e0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
33f0: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
3400: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
3410: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
3420: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
3430: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
3440: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
3450: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
3460: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
3470: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
3480: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
3490: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
34a0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
34b0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
34c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34d0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
34e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
34f0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
3500: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
3510: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
3520: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
3530: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
3540: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
3550: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
3560: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
3570: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
3580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3590: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
35a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
35b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
35d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
35e0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
35f0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
3600: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
3610: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
3620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
3630: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
3640: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
3650: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
3660: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
3670: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
3680: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
3690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36a0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
36b0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
36c0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
36e0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
36f0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
3700: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
3710: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
3720: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
3730: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
3740: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
3750: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
3760: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3780: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
3790: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
37a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
37b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37c0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
37d0: 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44  hen the BTS_PEND
37e0: 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20  ING flag.** may 
37f0: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
3800: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
3810: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
3820: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3830: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3840: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3850: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
3860: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
3870: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
3880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3890: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
38a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
38b0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
38c0: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
38d0: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
38e0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
38f0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
3900: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
3910: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
3920: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
3930: 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45   & BTS_EXCLUSIVE
3940: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3950: 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  iter==pLock->pBt
3960: 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ree );.    asser
3970: 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  t( pLock->pBtree
3980: 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b  ->inTrans>=pLock
3990: 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ->eLock );.    i
39a0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
39b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
39c0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
39d0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
39e0: 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  t( pLock->iTable
39f0: 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70  !=1 || pLock==&p
3a00: 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  ->lock );.      
3a10: 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  if( pLock->iTabl
3a20: 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=1 ){.        
3a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
3a40: 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
3a60: 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70  Iter = &pLock->p
3a70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
3a80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
3a90: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3aa0: 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70  PENDING)==0 || p
3ab0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
3ac0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3ad0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  r==p ){.    pBt-
3ae0: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3af0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3b00: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3b10: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3b20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74  .  }else if( pBt
3b30: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
3b40: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  2 ){.    /* This
3b50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3b60: 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70  led when Btree p
3b70: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
3b80: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
3b90: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
3bb0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
3bc0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
3bd0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
3be0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3bf0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
3c00: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
3c10: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
3c20: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
3c30: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
3c40: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
3c50: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
3c60: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3c70: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
3c80: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
3c90: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3ca0: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
3cb0: 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74  BTS_PENDING must
3cc0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
3cd0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
3ce0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
3cf0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
3d00: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3d10: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3d20: 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20   ~BTS_PENDING;. 
3d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3d40: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
3d50: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
3d60: 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  s held by Btree 
3d70: 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b  p into read-lock
3d80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3d90: 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  d downgradeAllSh
3da0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3db0: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
3dc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
3dd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
3de0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3df0: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3e00: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57  ock;.    pBt->pW
3e10: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3e20: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3e30: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
3e40: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
3e50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d    for(pLock=pBt-
3e60: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
3e70: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
3e80: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3e90: 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d  ( pLock->eLock==
3ea0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  READ_LOCK || pLo
3eb0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b  ck->pBtree==p );
3ec0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  .      pLock->eL
3ed0: 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
3ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3ef0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3f00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3f10: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3f20: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
3f30: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
3f40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64        /* Forward
3f50: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3f60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3f70: 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
3f80: 20 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f   *pPage);      /
3f90: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3fa0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
3fb0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
3fc0: 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
3fd0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3fe0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3ff0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
4000: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
4010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
4020: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
4030: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4040: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
4050: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
4060: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
4070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4080: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
4090: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
40a0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
40b0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
40c0: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
40d0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69  tex);.}../* Veri
40e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
40f0: 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61  or and the BtSha
4100: 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20  red agree about 
4110: 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72  what is the curr
4120: 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
4130: 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20  connetion. This 
4140: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
4150: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
4160: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
4170: 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  se .** connectio
4180: 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f  n pointers get o
4190: 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69  ut-of-sync, it i
41a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  s possible for r
41b0: 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20  outines like.** 
41c0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
41d0: 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20  to reference an 
41e0: 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  stale connection
41f0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65   pointer that re
4200: 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20  ferences a.** a 
4210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
4220: 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73  has already clos
4230: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
4240: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
4250: 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
4260: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64  tements only and
4270: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
4280: 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   of double-check
4290: 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72  ing that the btr
42a0: 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20  ee code.** does 
42b0: 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73  keep the databas
42c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
42d0: 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65  nters up-to-date
42e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42f0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
4300: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ed(BtCursor *p){
4310: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4320: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  rHoldsMutex(p) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
4340: 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42  Btree->db==p->pB
4350: 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  t->db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
4370: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
4380: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
4390: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
43a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
43b0: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
43c0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
43d0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
43e0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
43f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4400: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
4410: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
4420: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
4430: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
4440: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
4450: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
4460: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
4470: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
4480: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
44b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
44c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
44d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
44e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
44f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4500: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
4510: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
4520: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
4530: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4540: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
4550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4560: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
4570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4580: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
4590: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
45a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
45b0: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
45c0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
45d0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
45e0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
45f0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
4600: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
4610: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
4620: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
4630: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
4640: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
4650: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
4660: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
4670: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
4680: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4690: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
46a0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
46b0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
46c0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
46d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
46e0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
46f0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
4700: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
4710: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
4720: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
4730: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
4740: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
4750: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
4760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4770: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
4780: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
4790: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
47a0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
47b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
47c0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
47d0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
47e0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
47f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4800: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
4810: 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
4820: 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
4830: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4840: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
4850: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69  nging */.  i64 i
4860: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
4870: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
4880: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
4890: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
48a0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
48b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
48c0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
48d0: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
48e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
48f0: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4900: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4910: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4920: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4930: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4940: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
4950: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
4960: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
4970: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
4980: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
4990: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
49a0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
49b0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
49c0: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
49d0: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
49e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
49f0: 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26  Root==pgnoRoot &
4a00: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
4a10: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
4a20: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
4a30: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4a40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4a60: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4a70: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4a80: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4a90: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4aa0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4ab0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
4ac0: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4ae0: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4af0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4b00: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4b10: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4b20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4b30: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4b40: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4b50: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
4b60: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
4b70: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
4b80: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
4b90: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4ba0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
4bb0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4bc0: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4bd0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4be0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4bf0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4c00: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4c10: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4c20: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4c30: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4c40: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4c50: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
4c60: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
4c70: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
4c80: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c90: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
4ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
4cb0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4cc0: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4cd0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4ce0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4cf0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4d00: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4d10: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4d20: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4d30: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4d40: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4d50: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
4d60: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
4d70: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
4d80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4d90: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
4da0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
4db0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4dc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4dd0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4de0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4df0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4e00: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4e10: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4e20: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4e30: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4e40: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4e50: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4e60: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4e70: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4e80: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4e90: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4ea0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4eb0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4ec0: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4ed0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4ee0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4ef0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4f00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4f10: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4f20: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4f30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4f40: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4f50: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4f60: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4f70: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4f80: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4f90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4fa0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4fb0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4fc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4fd0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4fe0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4ff0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
5000: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
5010: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
5020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5030: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
5040: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
5050: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
5060: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
5070: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5080: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
5090: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
50a0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
50b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
50c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
50d0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
50e0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
50f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
5100: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
5110: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
5120: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
5130: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
5140: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
5150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
5160: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
5170: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
5180: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
5190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
51a0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
51b0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
51c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
51d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
51e0: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
51f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5200: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
5210: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5230: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
5240: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
5250: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
5260: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
5270: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
5280: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
5290: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
52a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
52b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
52c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
52d0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
52e0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
52f0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
5300: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5310: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
5320: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
5330: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
5340: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5350: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
5360: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5370: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
5380: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5390: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
53a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
53c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
53d0: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
53e0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
53f0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
5400: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
5410: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
5420: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
5430: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
5440: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
5450: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
5460: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
5470: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
5490: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
54a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
54b0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
54c0: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
54d0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
54e0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
54f0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5500: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5510: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5530: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5540: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5550: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5560: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
5570: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
5580: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
5590: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
55a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
55b0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
55c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
55d0: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
55e0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
55f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5600: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5610: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5620: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5630: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5640: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5660: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
5670: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75  int i;.  if( pCu
56a0: 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
56c0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
56d0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
56e0: 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
56f0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5700: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
5710: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
5720: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
5730: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d  >iPage = -1;.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
5750: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5760: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5770: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5780: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
57b0: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
57c0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
57d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
57e0: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
57f0: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5800: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
5810: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
5820: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
5830: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5840: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
5850: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
5860: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5870: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5880: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5890: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
58a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
58b0: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
58c0: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
58d0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
58e0: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
58f0: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5900: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
5910: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5920: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
5930: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
5940: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
5950: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
5960: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5970: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5980: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5990: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
59b0: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
59c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
59d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
59e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
59f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5a00: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5a10: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5a30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5a40: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5a50: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5a70: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5a80: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5a90: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5aa0: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5ab0: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5ac0: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5ad0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5ae0: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5af0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5b00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
5b10: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
5b20: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5b30: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5b40: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
5b50: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
5b60: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5b70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5b80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5b90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5ba0: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5bb0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5bc0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5bd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5be0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5bf0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5c40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
5c50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
5c60: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5c70: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5c80: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5c90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ca0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5cb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5cc0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5cd0: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5ce0: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5cf0: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5d00: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
5d10: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
5d20: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
5d30: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
5d40: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
5d50: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
5d60: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5d70: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5d80: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5d90: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5db0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5dc0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5dd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5de0: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5df0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5e00: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5e10: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5e30: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5e40: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5e50: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5e60: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5e80: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5e90: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5ea0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5eb0: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5ec0: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5ed0: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5ee0: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f00: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
5f10: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
5f20: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
5f30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5f40: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5f50: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
5f60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5f70: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5f80: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5f90: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5fa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5fd0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5fe0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5ff0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
6000: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
6010: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
6020: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
6030: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
6040: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
6050: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
6060: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6070: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
6080: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
6090: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
60a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
60b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
60c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
60d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
60e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
60f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
6100: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
6110: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
6120: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
6130: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
6140: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
6150: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
6160: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
6170: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
6180: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
6190: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
61a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
61b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
61c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
61d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
61e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
61f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
6200: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
6210: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
6220: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
6230: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
6240: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
6250: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
6260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
6270: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
6280: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
6290: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
62a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
62b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
62c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
62d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
62e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
62f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
6300: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
6310: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
6320: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
6330: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
6340: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
6350: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
6360: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
6370: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
6380: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
6390: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
63a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
63b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
63c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
63d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
63e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
63f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
6400: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
6410: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
6420: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
6430: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
6440: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
6450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
6460: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
6470: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
6480: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
6490: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
64a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
64b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
64c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
64d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
64e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
64f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
6500: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
6510: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
6520: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6530: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6540: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6550: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6560: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6570: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6580: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6590: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
65a0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
65b0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
65c0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
65d0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
65e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
65f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6600: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
6610: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
6620: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
6630: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
6640: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
6650: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
6660: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6670: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6680: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6690: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
66a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
66b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
66c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
66d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
66e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
66f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6700: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
6710: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
6720: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
6730: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
6740: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
6750: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
6760: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6770: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6780: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6790: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
67a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
67b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
67c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
67d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
67e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
67f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6800: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
6810: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
6820: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6830: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6840: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6850: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
6860: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6870: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6880: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6890: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
68a0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
68b0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
68c0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
68d0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
68e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
68f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
6910: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
6920: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62  >=0 );.        b
6930: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
6940: 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
6950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6960: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
6970: 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72  }while( p );.  r
6980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
69a0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
69b0: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
69c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
69d0: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
69e0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
69f0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a00: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6a20: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6a30: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6a40: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6a50: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
6a70: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
6a80: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
6a90: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
6aa0: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
6ab0: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
6ac0: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
6ad0: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
6ae0: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
6af0: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
6b00: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
6b10: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
6b20: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
6b30: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
6b40: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
6b50: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
6b60: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
6b70: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
6b80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
6b90: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
6ba0: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
6bb0: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
6bc0: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
6bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
6be0: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
6bf0: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
6c00: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
6c10: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
6c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
6c30: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
6c40: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
6c50: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
6c60: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
6c70: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
6c80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
6cb0: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
6cc0: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
6cd0: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
6ce0: 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28  ex key */..  if(
6cf0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6d00: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6d10: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6d20: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6d30: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6d40: 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e  kedRecord(pCur->
6d50: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6d60: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6d80: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6d90: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6da0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6db0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6dc0: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6dd0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
6de0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
6df0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6e10: 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
6e20: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _done;.    }.  }
6e30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
6e40: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
6e50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
6e60: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
6e70: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
6e80: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d  , bias, pRes);.m
6e90: 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66  oveto_done:.  if
6ea0: 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6ec0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6ed0: 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  b, pIdxKey);.  }
6ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ef0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6f00: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6f10: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6f20: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6f30: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6f40: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6f50: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6f60: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
6f70: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
6f80: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
6f90: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
6fa0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
6fb0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6fc0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6fd0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6fe0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6ff0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
7000: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
7010: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
7020: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
7030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
7040: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7050: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
7060: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
7070: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
7080: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
7090: 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
70a0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
70b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
70c0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
70d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
70e0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
70f0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
7100: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
7110: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
7120: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7130: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
7140: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
7150: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7160: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
7170: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
7180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71a0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
71b0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
71c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
71d0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
71e0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
71f0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7200: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
7210: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
7220: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
7230: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
7240: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
7250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7260: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
7270: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7280: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
7290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
72a0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
72b0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
72c0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
72d0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
72e0: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
72f0: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
7300: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7310: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
7320: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
7330: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
7340: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
7350: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
7360: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
7370: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
7380: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
7390: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
73a0: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
73b0: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
73c0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
73d0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
73e0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
73f0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
7400: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
7410: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
7420: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
7430: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
7440: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
7450: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
7460: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7470: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
7480: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
7490: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
74a0: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
74b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
74c0: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
74d0: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
74e0: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
74f0: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
7500: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
7530: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7540: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
7550: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
7560: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
7570: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
75a0: 61 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  ake BtCursor obj
75b0: 65 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c  ect that will al
75c0: 77 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66  ways answer.** f
75d0: 61 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69  alse to the sqli
75e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
75f0: 73 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65  sMoved() routine
7600: 20 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b   above.  The fak
7610: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75  e.** cursor retu
7620: 72 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65  rned must not be
7630: 20 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f   used with any o
7640: 74 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72  ther Btree inter
7650: 66 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f  face..*/.BtCurso
7660: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  r *sqlite3BtreeF
7670: 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76  akeValidCursor(v
7680: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75  oid){.  static u
7690: 38 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43  8 fakeCursor = C
76a0: 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61  URSOR_VALID;.  a
76b0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
76c0: 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65  BtCursor, eState
76d0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
76e0: 20 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b   (BtCursor*)&fak
76f0: 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eCursor;.}../*.*
7700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7710: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7720: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7730: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7740: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
7750: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
7760: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7770: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7780: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7790: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
77a0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
77b0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
77c0: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
77d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
77e0: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
77f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7800: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7810: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7820: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7830: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7840: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
7850: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
7860: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7870: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7880: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7890: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
78a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
78b0: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
78c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
78d0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
78e0: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
78f0: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7900: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7910: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7920: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7940: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
7950: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
7960: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7970: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7980: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7990: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
79a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
79b0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
79c0: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
79d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
79e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
79f0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7a00: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7a10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7a20: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7a30: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7a40: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
7a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7a70: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7a80: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7a90: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ab0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ac0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7ad0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7ae0: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7af0: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7b00: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7b10: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7b20: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7b30: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7b40: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
7b50: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
7b60: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7b70: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7b80: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7b90: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7ba0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7bb0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7bd0: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7be0: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7bf0: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7c00: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7c10: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7c20: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7c30: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7c40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
7c50: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
7c60: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7c80: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7c90: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7ca0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7cb0: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7cc0: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7cd0: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7ce0: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7cf0: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7d00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7d20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7d30: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7d40: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
7d50: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
7d60: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7d70: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7d80: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7d90: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7da0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7db0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7dd0: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7de0: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7df0: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7e00: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7e20: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7e30: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7e40: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
7e50: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
7e60: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7e70: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7e80: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7e90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7ea0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7eb0: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7ec0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7ed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7ee0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7ef0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f00: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7f10: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7f20: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7f30: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7f40: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
7f50: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
7f60: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7f70: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7f80: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7f90: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7fa0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7fb0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7fc0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7fd0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7fe0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7ff0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
8000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8010: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
8020: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
8030: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
8040: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
8050: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
8060: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
8070: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
8080: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
8090: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
80a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
80b0: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
80c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
80d0: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
80e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
80f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8100: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
8110: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
8120: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
8130: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
8140: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
8150: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
8160: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
8170: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
8180: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
8190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
81a0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
81b0: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
81c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
81d0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
81e0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
81f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
8210: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8220: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
8230: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8240: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8250: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8260: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
8270: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
8280: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
8290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
82b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
82c0: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
82d0: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
82e0: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
82f0: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
8300: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
8310: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
8320: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
8330: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8340: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
8350: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
8360: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
8370: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8390: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
83a0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
83b0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
83c0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
83d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
83e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
83f0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8400: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
8410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8420: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
8430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
8440: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
8450: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
8460: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
8470: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
8480: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
8490: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
84a0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
84b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
84c0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
84d0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
84e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
84f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8500: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8510: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
8520: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
8530: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
8540: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
8550: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
8560: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
8570: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8580: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8590: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
85a0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
85b0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
85c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
85d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
85e0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
85f0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
8600: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
8610: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
8620: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
8630: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
8640: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
8650: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
8660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8670: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8680: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
86a0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
86b0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
86c0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
86d0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
86e0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
86f0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8700: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8710: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8720: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8730: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8740: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8750: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
8760: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8770: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8780: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8790: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
87a0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
87b0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
87c0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
87d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
87e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8810: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8820: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8830: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8840: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8850: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8860: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8870: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8880: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8890: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
88a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
88b0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
88c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
88d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
88e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
88f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8900: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8910: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8920: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8930: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8940: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8950: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8960: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8970: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8980: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8990: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
89a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
89b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
89c0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
89e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
89f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8a00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8a10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8a20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8a30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8a50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8a60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8a70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8a80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8a90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8aa0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8ab0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8ac0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8ad0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74  CORRUPT_PGNO(iPt
8ae0: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
8af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
8b00: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
8b10: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
8b20: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
8b30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
8b40: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
8b50: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8b60: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8b70: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8b80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8b90: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8ba0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8bb0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8bc0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8bd0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8be0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8bf0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8c00: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8c10: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8c20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8c30: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8c40: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8c50: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8c60: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8c70: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8c80: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8c90: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8ca0: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8cb0: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8cc0: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8cd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8ce0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8cf0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8d00: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8d10: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8d20: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
8d30: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
8d40: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8d50: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8d60: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8d70: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8d80: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8d90: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8da0: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8db0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8dc0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8dd0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8de0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8df0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
8e00: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
8e10: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
8e20: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
8e30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8e40: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
8e50: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8e60: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8e70: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8e80: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8e90: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8ea0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8eb0: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8ec0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8ed0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8ee0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8ef0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
8f00: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
8f10: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
8f20: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8f30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8f40: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8f50: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8f60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8f70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8f80: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f90: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8fa0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8fb0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8fd0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8fe0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8ff0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9000: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9010: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9020: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9030: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9040: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9060: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9070: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9080: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9090: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
90a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
90b0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
90c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
90d0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
90e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
90f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9100: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9110: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9120: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9130: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9140: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9150: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9160: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9170: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9180: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9190: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
91a0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
91b0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
91c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
91d0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
91e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
91f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9200: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9210: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9220: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9230: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9240: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9250: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9260: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9270: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9280: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9290: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
92a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
92b0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
92c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
92e0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
92f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9300: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9310: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9320: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9330: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9340: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9350: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9360: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9370: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9380: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9390: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
93a0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
93b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
93c0: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
93d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
93e0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
93f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9400: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
9410: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
9420: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9430: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9440: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9450: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9460: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9470: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9480: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9490: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
94a0: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
94b0: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
94c0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
94d0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
94e0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
94f0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9500: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
9510: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
9520: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9530: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9540: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9550: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9560: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9570: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9580: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9590: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
95a0: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
95b0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
95c0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
95d0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
95e0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
95f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9600: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9610: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9620: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9640: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9650: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9660: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9670: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9690: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
96b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
96c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
96d0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
96e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9700: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9710: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9720: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9730: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9740: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9750: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9760: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9770: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9780: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
97b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
97c0: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
97d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
97e0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
97f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9800: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9810: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9820: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9840: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9850: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9890: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98b0: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
98c0: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
98d0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
98f0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9900: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9910: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9930: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9940: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9960: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9970: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9980: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9990: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
99a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
99b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
99c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
99d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99e0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
99f0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9a00: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9a10: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9a20: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9a30: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9a40: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9a50: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9a60: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9a70: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9a80: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9a90: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9aa0: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9ab0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9ac0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9ad0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9ae0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9af0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9b00: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9b10: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9b20: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9b30: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9b40: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9b50: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9b60: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9b70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9b80: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9b90: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9ba0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9bb0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9bc0: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9bd0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9be0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9bf0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9c00: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9c10: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9c20: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9c30: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9c40: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9c50: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9c60: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9c70: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9c80: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9c90: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9cb0: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9cc0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9cd0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9ce0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9cf0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d20: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
9d40: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
9d50: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9d60: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9d70: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9d80: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9d90: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9da0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9db0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9dc0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9dd0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9de0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9df0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9e00: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9e10: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9e20: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9e30: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9e40: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9e50: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9e60: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9e70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9e80: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9e90: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9ea0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9eb0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9ec0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9ed0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9ee0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ef0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9f00: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9f10: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9f20: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9f30: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9f40: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9f50: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9f60: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9f70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9f80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9f90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9fa0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9fb0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9fc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9fd0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9fe0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9ff0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a000: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a010: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a020: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a030: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a040: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a050: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a060: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a080: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a090: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a0b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a0c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a0d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a0e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a0f0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a100: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a110: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a120: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a130: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a140: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a150: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a160: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a170: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a180: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a190: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a1a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a1b0: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a1c0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a1d0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a1e0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a1f0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a200: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a210: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a230: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a240: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a250: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a260: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a270: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a2a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a2b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a2c0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a2d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a2e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a2f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a300: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a310: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a320: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a330: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a340: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a350: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a360: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a370: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a380: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a390: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a3a0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a3b0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a3c0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a3d0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a3f0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a400: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a410: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a420: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a430: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a440: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a450: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a460: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a470: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a480: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a4a0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a4b0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a4c0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a4d0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a4e0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a4f0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a500: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a510: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a520: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a530: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a550: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a560: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a570: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a580: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a590: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a5a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a5b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a5c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a5d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a5e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a5f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a600: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a610: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a620: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a630: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a640: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a650: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a660: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a670: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a680: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a690: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6a0: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a6b0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a6c0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a6e0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a6f0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a700: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a710: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a720: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a730: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a740: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a750: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a760: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a770: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a780: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a790: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a7c0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a7d0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a810: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a820: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a830: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a840: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a850: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a860: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a870: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a880: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a890: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a8a0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a8c0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a8d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a8e0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a8f0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a900: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a910: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a920: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a930: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a940: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a950: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a960: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a970: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a980: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a990: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a9a0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a9b0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a9c0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a9d0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a9e0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a9f0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
aa00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
aa10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
aa20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
aa30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
aa50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
aa60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
aa70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
aa80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
aa90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
aaa0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
aab0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
aac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
aad0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
aae0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
aaf0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
ab00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ab10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
ab20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ab30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ab40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ab50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ab60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ab70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ab80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ab90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
aba0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
abb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
abc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
abd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
abe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
abf0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
ac00: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
ac10: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
ac20: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
ac30: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
ac40: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
ac50: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
ac60: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
ac70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
ac80: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
ac90: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
aca0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
acb0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
acc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
acd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
ace0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
acf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
ad00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
ad10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
ad20: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
ad30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ad40: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
ad50: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
ad60: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
ad70: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
ad80: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
ad90: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
ada0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
adb0: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
adc0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
add0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
ade0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
adf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
ae00: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
ae10: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
ae20: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
ae30: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
ae40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
ae50: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
ae60: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
ae70: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ae80: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
ae90: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
aea0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
aeb0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
aec0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
aed0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
aee0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
aef0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
af00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
af10: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
af20: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
af30: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
af40: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
af50: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
af60: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
af70: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
af80: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
af90: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
afa0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
afb0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
afc0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
afd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
afe0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
aff0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b000: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b010: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b020: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b030: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b040: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b050: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b060: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b070: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b080: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b090: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b0a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b0b0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b0c0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b0d0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b0e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b0f0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b100: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b110: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b120: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b130: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b140: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b150: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b160: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b170: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b180: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b190: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
b1a0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
b1b0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
b1c0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
b1d0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
b1e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
b1f0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
b200: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
b210: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
b220: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
b240: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
b250: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
b260: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
b270: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
b280: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
b290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
b2a0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
b2b0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b2c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
b2d0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
b2e0: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
b2f0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
b300: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
b310: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
b320: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
b330: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
b340: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
b350: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
b360: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
b370: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
b390: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
b3a0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
b3b0: 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c  reorganizes cell
b3c0: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
b3d0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
b3e0: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62  re are no free-b
b3f0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65  locks on the fre
b400: 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a  e-block list..**
b410: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d  .** Parameter nM
b420: 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61  axFrag is the ma
b430: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
b440: 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  fragmented space
b450: 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
b460: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70  present in the p
b470: 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72  age after this r
b480: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
b490: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
b4a0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
b4b0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
b4c0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
b4d0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
b4e0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
b4f0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
b500: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
b510: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
b520: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
b530: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
b540: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
b550: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
b560: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
b570: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
b580: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
b590: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
b5a0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
b5b0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
b5c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61   *pPage, int nMa
b5d0: 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b  xFrag){.  int i;
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b600: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b630: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
b640: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b670: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
b680: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b6a0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
b6c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b6d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
b6e0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
b6f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
b700: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b720: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
b730: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
b740: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
b750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
b770: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
b780: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b7a0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
b7b0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
b7c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b7d0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
b7e0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
b7f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
b800: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
b810: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
b820: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
b830: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
b850: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
b860: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
b870: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b880: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
b890: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
b8a0: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b8c0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
b8d0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  l index */..  as
b8e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b8f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b900: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b910: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b920: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b950: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b960: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b970: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b980: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b9a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b9b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b9c0: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b9d0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b9e0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b9f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
ba00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
ba10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
ba20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
ba30: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
ba40: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
ba50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ba60: 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   );.  iCellFirst
ba70: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ba80: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c  2*nCell;.  usabl
ba90: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
baa0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bab0: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
bac0: 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77   handles pages w
bad0: 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72  ith two or fewer
bae0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64   free blocks and
baf0: 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f   nMaxFrag.  ** o
bb00: 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74  r fewer fragment
bb10: 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69  ed bytes. In thi
bb20: 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73  s case it is fas
bb30: 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a  ter to move the.
bb40: 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65    ** two (or one
bb50: 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c  ) blocks of cell
bb60: 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28  s using memmove(
bb70: 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65  ) and add the re
bb80: 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73  quired.  ** offs
bb90: 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e  ets to each poin
bba0: 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  ter in the cell-
bbb0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68  pointer array th
bbc0: 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a  an it is to .  *
bbd0: 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68  * reconstruct th
bbe0: 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20  e entire page.  
bbf0: 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61  */.  if( (int)da
bc00: 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46  ta[hdr+7]<=nMaxF
bc10: 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  rag ){.    int i
bc20: 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28  Free = get2byte(
bc30: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
bc40: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
bc50: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
bc60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bc70: 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20  a[iFree]);..    
bc80: 20 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f    /* pageFindSlo
bc90: 74 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  t() has already 
bca0: 76 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72  verified that fr
bcb0: 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f  ee blocks are so
bcc0: 72 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rted.      ** in
bcd0: 20 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74   order of offset
bce0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bcf0: 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c  , and that no bl
bd00: 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ock extends.    
bd10: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bd20: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50  d of the page. P
bd30: 72 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20  rovided the two 
bd40: 66 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f  free slots do no
bd50: 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  t .      ** over
bd60: 6c 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e  lap, this guaran
bd70: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65  tees that the me
bd80: 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65  mmove() calls be
bd90: 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
bda0: 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20     ** overwrite 
bdb0: 74 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62  the usableSize b
bdc0: 79 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e  yte buffer, even
bdd0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
bde0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
bdf0: 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
be00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
be10: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
be20: 3e 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  >iFree );.      
be30: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65  assert( iFree+ge
be40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
be50: 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  ee+2]) <= usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
be70: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
be80: 7c 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79  || iFree2+get2by
be90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bea0: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
beb0: 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
bec0: 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61  0==iFree2 || (da
bed0: 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26  ta[iFree2]==0 &&
bee0: 20 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d   data[iFree2+1]=
bef0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  =0) ){.        u
bf00: 38 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b  8 *pEnd = &data[
bf10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
bf20: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75  ll*2];.        u
bf30: 38 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20  8 *pAddr;.      
bf40: 20 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20    int sz2 = 0;. 
bf50: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
bf60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
bf70: 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20  Free+2]);.      
bf80: 20 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32    int top = get2
bf90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bfa0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
bfb0: 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20  top>=iFree ){.  
bfc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
bfe0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
bff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c000: 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20   iFree2 ){.     
c010: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c020: 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b  ee+sz<=iFree2 );
c030: 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79 20   /* Verified by 
c040: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a  pageFindSlot() *
c050: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  /.          sz2 
c060: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c070: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
c080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c090: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
c0a0: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
c0b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
c0c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
c0d0: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
c0e0: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
c0f0: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
c100: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
c110: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
c120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c130: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
c140: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c150: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
c160: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
c170: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
c180: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
c190: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
c1a0: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
c1b0: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
c1c0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
c1d0: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
c1e0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
c1f0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
c200: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
c210: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
c220: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
c230: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
c240: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
c250: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
c260: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
c270: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c280: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
c290: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
c2a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
c2b0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
c2c0: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
c2d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
c2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
c2f0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
c300: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
c310: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
c320: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
c330: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
c340: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
c350: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c360: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
c370: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
c380: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
c390: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
c3a0: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
c3b0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
c3c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c3d0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
c3e0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
c3f0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
c400: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
c410: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c420: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c430: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c460: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
c470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
c480: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
c490: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
c4a0: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
c4b0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
c4c0: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
c4d0: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
c4e0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
c4f0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
c500: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
c510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c530: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
c540: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c550: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
c560: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
c570: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
c580: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
c590: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c5b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
c5c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
c5d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
c5e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
c5f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
c600: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
c610: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
c620: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
c630: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
c640: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
c650: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
c660: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c670: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
c680: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
c690: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
c6a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
c6b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
c6c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
c6d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
c6e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
c6f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c700: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
c710: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
c720: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
c730: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
c740: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
c750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c760: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
c780: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
c790: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c7a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
c7b0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
c7c0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
c7d0: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
c7e0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
c7f0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
c800: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
c810: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c820: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c830: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
c860: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
c870: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
c880: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
c890: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
c8a0: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
c8b0: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
c8c0: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
c8d0: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
c8e0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
c8f0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
c900: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
c910: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
c920: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
c930: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
c940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
c950: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c960: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
c970: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
c980: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
c990: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
c9a0: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
c9b0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
c9c0: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c9e0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
c9f0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
ca00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
ca10: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
ca20: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
ca30: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
ca40: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
ca50: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
ca60: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
ca70: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
ca80: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ca90: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
caa0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
cab0: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
cac0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
cad0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cae0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
caf0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cb00: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
cb10: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
cb20: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
cb30: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
cb40: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cb50: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
cb60: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
cb70: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
cb80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
cb90: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
cba0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cbb0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
cbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
cbd0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
cbe0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  <=usableSize-4 )
cbf0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cc00: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
cc10: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
cc20: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
cc30: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
cc40: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
cc50: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
cc60: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
cc70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
cc80: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
cc90: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
cca0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
ccb0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
ccc0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
ccd0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
cce0: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
ccf0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
cd00: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
cd10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cd20: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
cd30: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
cd40: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
cd50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
cd60: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
cd70: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
cd80: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
cd90: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
cda0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
cdb0: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
cdc0: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
cdd0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
cde0: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
cdf0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ce00: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ce10: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
ce20: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
ce30: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
ce40: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
ce50: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
ce60: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
ce70: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
ce80: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
ce90: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cea0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
ceb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cec0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
ced0: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cee0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cef0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cf00: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cf10: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cf20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cf30: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cf40: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cf50: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cf60: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cf70: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cf80: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cf90: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cfb0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cfc0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cfe0: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cff0: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
d000: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
d010: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
d020: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
d030: 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b  dr+size ) break;
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b  .  }.  if( pc ){
d050: 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49  .    *pRc = SQLI
d060: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
d070: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
d080: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d090: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
d0a0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
d0b0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
d0c0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
d0d0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
d0e0: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
d0f0: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
d100: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
d110: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
d120: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
d130: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
d140: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
d150: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
d160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
d170: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
d180: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
d190: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
d1a0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
d1b0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
d1c0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
d1d0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
d1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d1f0: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
d200: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
d210: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
d220: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
d230: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
d240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d250: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
d260: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
d270: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
d280: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
d290: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
d2a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
d2b0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
d2c0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
d2d0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
d2e0: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
d2f0: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
d300: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
d310: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d320: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
d330: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d340: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
d350: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
d360: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
d370: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
d380: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d390: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d3a0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
d3b0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d3c0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
d3d0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d3e0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
d3f0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d420: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
d430: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
d440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
d470: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
d480: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
d490: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
d4a0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
d4b0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
d4c0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
d4d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
d4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d510: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
d520: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d530: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d540: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d550: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
d560: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
d570: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d580: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d590: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
d5a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d5b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
d5c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
d5d0: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
d5e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d5f0: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
d600: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
d610: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
d620: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
d630: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
d640: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
d650: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
d660: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
d670: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
d680: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
d690: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
d6a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
d6b0: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
d6c0: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
d6d0: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
d6e0: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
d6f0: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
d700: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
d710: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
d720: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
d730: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
d740: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
d750: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
d760: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
d770: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
d780: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
d790: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
d7a0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
d7b0: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
d7c0: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
d7d0: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
d7e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7f0: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
d800: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
d810: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d820: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
d830: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
d840: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
d850: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
d860: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
d870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
d880: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
d890: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
d8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d8b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d8c0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d8e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
d8f0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
d900: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
d910: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
d920: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
d930: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
d940: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
d950: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
d960: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
d970: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
d980: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
d990: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
d9a0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
d9b0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
d9c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d9d0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
d9e0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
d9f0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
da00: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
da10: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
da20: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
da30: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
da40: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
da50: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
da60: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
da70: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
da80: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
da90: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
daa0: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
dab0: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
dac0: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
dad0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
dae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
daf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
db00: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
db20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
db30: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
db40: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
db50: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
db60: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
db70: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
db80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
db90: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
dbb0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
dbc0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
dbd0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
dbe0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
dbf0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
dc00: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
dc10: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
dc20: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
dc30: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
dc40: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
dc50: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dc60: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
dc70: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
dc80: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
dc90: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
dca0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
dcb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
dcc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
dcd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
dce0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
dcf0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
dd00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
dd10: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
dd20: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
dd30: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
dd40: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
dd50: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
dd60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
dd70: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
dd80: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
dd90: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
dda0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
ddb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ddc0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
ddd0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
dde0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
ddf0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
de00: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
de10: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
de20: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
de30: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
de40: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
de50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
de60: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
de70: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
de80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
de90: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
dea0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
deb0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
dec0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
ded0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
dee0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
def0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
df00: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
df10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
df20: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
df30: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
df40: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
df50: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
df60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
df70: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
df80: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
df90: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
dfa0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
dfb0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
dfc0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
dfd0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
dfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
dff0: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e000: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e010: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e020: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e030: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e040: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e050: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e060: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e070: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e080: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e090: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e0b0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e0c0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e0e0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e0f0: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e100: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e110: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e140: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e150: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e160: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e190: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e1a0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e1b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e1e0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e1f0: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e200: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e220: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e230: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e240: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e250: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e260: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e270: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e280: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e2b0: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
e2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
e2d0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
e2e0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
e2f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
e300: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
e310: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
e320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e330: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e340: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
e350: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
e360: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
e370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e380: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
e390: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
e3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e3b0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e3c0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
e3d0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
e3e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
e400: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
e410: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
e420: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
e430: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e440: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e450: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e460: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
e470: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
e480: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e490: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
e4a0: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
e4b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
e4c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
e4d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
e4e0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
e4f0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
e500: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
e510: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
e520: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
e530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
e540: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
e550: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
e560: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
e570: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
e580: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
e590: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
e5a0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
e5b0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
e5c0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
e5d0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
e5e0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
e5f0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
e600: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e610: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
e620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
e630: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
e640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
e650: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
e660: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e670: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e680: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
e6a0: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e6b0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e6c0: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
e6d0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
e6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e700: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
e720: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
e730: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
e740: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e750: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
e760: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
e770: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
e780: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
e790: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
e7a0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
e7b0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
e7c0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
e7d0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
e7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e7f0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
e800: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
e810: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
e820: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
e830: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
e840: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
e850: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
e860: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
e870: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
e880: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
e890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e8a0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e8b0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
e8c0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
e8d0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
e8e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e8f0: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
e900: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
e910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e930: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e940: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
e950: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
e960: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
e970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e980: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
e990: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
e9a0: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
e9b0: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
e9c0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
e9d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
e9e0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
e9f0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
ea00: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
ea10: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
ea20: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
ea30: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
ea40: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
ea50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
ea60: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
ea70: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
ea80: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
ea90: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
eaa0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
eab0: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
eac0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
ead0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
eae0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eaf0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
eb00: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
eb10: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
eb20: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
eb30: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
eb40: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
eb50: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
eb60: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
eb70: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
eb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eb90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eba0: 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
ebb0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
ebc0: 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
ebd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ebe0: 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
ebf0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
ec00: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
ec10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
ec20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec30: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
ec40: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
ec50: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ec60: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
ec70: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
ec80: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
ec90: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
eca0: 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
ecb0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ecd0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ece0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ecf0: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
ed00: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
ed10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
ed20: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
ed30: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
ed40: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
ed50: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
ed60: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
ed70: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
ed80: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
ed90: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
eda0: 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
edb0: 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
edc0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
edd0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ede0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
edf0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ee00: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
ee10: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ee20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ee30: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
ee40: 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
ee50: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
ee60: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
ee70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
ee80: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
ee90: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
eea0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
eeb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
eed0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
eee0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
eef0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
ef00: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
ef10: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
ef20: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
ef30: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
ef40: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
ef50: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
ef60: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
ef70: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
ef80: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
ef90: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
efa0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
efb0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
efc0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
efd0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
efe0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
eff0: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
f000: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f010: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
f020: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f030: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f040: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
f060: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
f070: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
f080: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
f090: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
f0a0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
f0b0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
f0c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f0d0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
f0e0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
f0f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f110: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f120: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
f130: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
f140: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
f150: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
f160: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
f170: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
f180: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f190: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
f1a0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
f1b0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f1c0: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
f1d0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
f1e0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
f1f0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f200: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
f210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f220: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
f230: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
f240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f250: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f260: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
f270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
f2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
f2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
f2c0: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
f2d0: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
f2e0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f2f0: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
f300: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
f310: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f320: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
f330: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
f340: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
f350: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
f360: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f370: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
f380: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f390: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f3a0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f3b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f3d0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f3e0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
f3f0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f400: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
f410: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
f420: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
f430: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
f440: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
f450: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
f460: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
f470: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
f480: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
f490: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
f4a0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
f4b0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
f4c0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
f4d0: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
f4e0: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
f4f0: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
f500: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
f510: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
f520: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
f530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f540: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
f550: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
f560: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
f570: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
f580: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
f590: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f5a0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
f5b0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f5c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f5d0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f5e0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f5f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f600: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f610: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f620: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f630: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f640: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
f650: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
f660: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
f670: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
f680: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f690: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
f6a0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f6b0: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
f6c0: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
f6d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
f6e0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
f6f0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
f700: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f720: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
f730: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f740: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f750: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f770: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f780: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f790: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f7a0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f7b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f7c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f7d0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f7e0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f7f0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f800: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f810: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f820: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f830: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f840: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f850: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f860: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f870: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f880: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f890: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f8a0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f8b0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f8c0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f8e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f8f0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f900: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
f910: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f920: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
f930: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
f940: 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
f950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f960: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
f970: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
f980: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f9a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f9b0: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
f9c0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f9d0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f9e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
f9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
fa00: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
fa10: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
fa20: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
fa30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
fa40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
fa50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
fa60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
fa70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
fa80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
fa90: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
faa0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
fab0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fad0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
fae0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
faf0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
fb00: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fb10: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fb20: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb30: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
fb40: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
fb50: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
fb60: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
fb70: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
fb80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
fb90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
fbb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fbc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fbd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
fbe0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
fbf0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
fc00: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fc10: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fc20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
fc30: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
fc40: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
fc50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fc60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fc70: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
fc80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
fc90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
fcb0: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
fcc0: 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
fcd0: 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
fce0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
fcf0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
fd00: 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
fd10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
fd20: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
fd30: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
fd40: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
fd50: 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
fd60: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
fd70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
fd80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
fd90: 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
fda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fdb0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
fdc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
fdd0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fde0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
fdf0: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
fe00: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
fe10: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
fe20: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
fe30: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
fe40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
fe50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
fe60: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
fe70: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
fe80: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
fe90: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
fea0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
feb0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
fec0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
fed0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
fee0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
fef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ff00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ff10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ff20: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ff30: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
ff40: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
ff50: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
ff60: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
ff70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ff80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ff90: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ffa0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
ffb0: 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
ffc0: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
ffd0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
ffe0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fff0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
10000 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
10010 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
10020 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10030 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
10040 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
10050 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
10060 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
10070 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
10080 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
10090 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
100a0 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
100b0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
100c0 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
100d0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
100e0 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
100f0 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10120 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
10130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10150 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10160 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
10170 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
10180 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
10190 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  ich is only.  **
101a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
101b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
101c0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
101d0 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
101e0 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74   the.  ** offset
101f0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
10200 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
10210 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
10220 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a  ze minus the.  *
10230 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
10240 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
10250 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
10260 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
10270 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
10280 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a  RUPT_DB );..  /*
10290 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
102a0 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
102b0 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
102c0 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
102d0 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
102e0 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
102f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65    .  **.  ** The
10300 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
10310 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
10320 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
10330 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
10340 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
10350 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
10360 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
10370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
10380 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e   be .  ** return
10390 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
103a0 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   */.  iCellFirst
103b0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
103c0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
103d0 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
103e0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
103f0 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
10400 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
10410 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e  SizeCk ){.    in
10420 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10430 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10440 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10450 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
10460 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
10470 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
10480 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  */..    if( !pPa
10490 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
104a0 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28  Last--;.    for(
104b0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
104c0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
104d0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
104e0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
104f0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10510 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
10520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10530 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10540 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
10550 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
10560 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
10570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10580 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
105a0 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
105b0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
105c0 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
105d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
105e0 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
105f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
10600 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10630 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10650 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10660 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
10670 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
10680 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
10690 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
106a0 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
106b0 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
106c0 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
106d0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
106e0 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
106f0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
10700 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
10710 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
10720 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
10730 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
10740 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
10750 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10760 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
10770 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10780 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10790 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
107a0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
107b0 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
107c0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
107d0 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
107e0 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
107f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
10800 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
10810 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
10820 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
10830 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
10840 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
10850 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
10860 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
10870 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
10880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
108a0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
108b0 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
108c0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
108d0 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
108e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
108f0 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
10900 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
10910 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
10920 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10930 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10940 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
10950 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10960 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
10970 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
10980 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
10990 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
109a0 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
109b0 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
109c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
109d0 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
109e0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
109f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
10a00 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
10a10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10a40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10a50 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
10a60 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
10a70 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10a80 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
10a90 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
10aa0 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
10ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ac0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10ad0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
10ae0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10af0 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
10b00 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
10b10 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10b20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10b30 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b40 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
10b50 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
10b60 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
10b70 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b80 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
10b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10ba0 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
10bb0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
10bc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
10bd0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
10be0 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
10bf0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
10c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
10c10 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
10c20 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
10c30 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
10c40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
10c50 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
10c60 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
10c70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10c80 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
10c90 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10cb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
10cc0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10cd0 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
10ce0 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
10cf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
10d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
10d20 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
10d30 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
10d40 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
10d50 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
10d60 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
10d70 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
10d80 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
10d90 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
10da0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10db0 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10dc0 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
10dd0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
10de0 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
10df0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10e00 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
10e10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e20 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
10e30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10e40 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
10e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10e70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10e80 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
10e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10eb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10ec0 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10ee0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10ef0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10f00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10f10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10f20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10f30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10f40 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
10f50 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
10f60 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
10f70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10f80 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10f90 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10fa0 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
10fb0 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
10fc0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
10fd0 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
10fe0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
10ff0 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
11000 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
11010 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
11020 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11030 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
11040 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
11050 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
11060 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
11070 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
11080 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11090 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
110a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
110b0 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
110c0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
110d0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
110e0 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
110f0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
11100 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
11110 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
11120 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11130 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
11140 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
11150 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
11160 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11170 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11180 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11190 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
111a0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
111b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
111c0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
111d0 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
111e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
111f0 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
11200 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
11210 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
11230 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
11240 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
11250 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
11260 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
11270 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
11280 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11290 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
112a0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
112b0 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
112c0 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
112d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
112e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
112f0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
11300 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
11310 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
11320 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11330 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
11340 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
11350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
11360 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
11370 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
11390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
113a0 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
113b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
113d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
113e0 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
113f0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11400 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11410 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
11420 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
11430 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
11440 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
11450 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
11460 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
11470 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11480 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11490 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
114a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
114b0 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
114c0 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
114d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
114e0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
114f0 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11500 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11510 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
11520 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
11530 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
11540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11550 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
11560 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
11570 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
11580 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
11590 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
115a0 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
115b0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
115c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
115d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
115e0 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
115f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11600 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11610 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11630 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11640 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11650 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11670 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11680 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11690 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
116a0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
116b0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
116c0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
116d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
116e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
116f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
11700 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
11710 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11720 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
11730 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
11740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11780 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
11790 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
117a0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
117b0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
117c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
117d0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
117e0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
117f0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
11800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
11820 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
11830 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
11840 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
11850 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11860 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
11870 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
11880 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
11890 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
118a0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
118b0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
118c0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
118d0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
118e0 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
118f0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
11900 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11910 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
11950 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
11960 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
11970 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
11980 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
11990 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
119a0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119b0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119c0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
119d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
119e0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11a00 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
11a10 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
11a20 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
11a30 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
11a40 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
11a50 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
11a60 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
11a70 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
11a80 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
11a90 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
11aa0 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
11ab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
11ac0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
11ad0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
11ae0 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
11af0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
11b00 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11b10 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11b20 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
11b30 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11b40 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
11b50 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
11b60 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
11b70 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
11b80 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
11b90 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
11ba0 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
11bb0 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
11bc0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
11bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
11be0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
11bf0 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
11c00 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
11c10 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
11c20 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
11c30 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
11c40 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
11c50 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
11c60 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
11c70 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
11c80 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
11c90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11ca0 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
11cb0 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
11cc0 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
11cd0 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
11ce0 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
11cf0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
11d00 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
11d10 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
11d20 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11d30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11d40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11d50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
11d60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d80 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11d90 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
11da0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
11db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
11dd0 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
11de0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
11df0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
11e00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
11e10 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
11e20 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
11e30 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
11e60 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
11e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
11e80 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
11e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11ec0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11ed0 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
11ee0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
11ef0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
11f00 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
11f10 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
11f20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f30 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
11f40 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
11f50 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
11f60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
11f70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11f80 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
11f90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11fa0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
11fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
11fd0 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
11fe0 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
11ff0 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
12000 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12010 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12020 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
12030 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
12040 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
12050 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
12060 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
12070 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
120b0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
120c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
120f0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
12100 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12110 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
12120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
12130 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
12140 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12150 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
12160 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12170 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
12190 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
121a0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
121b0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
121c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
121d0 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
121e0 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
121f0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
12200 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
12210 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
12220 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
12230 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
12240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12250 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
12260 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65  (pgno);.    rele
12270 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
12280 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12290 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
122a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
122b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64  LITE_OK;..getAnd
122c0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a  InitPage_error:.
122d0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
122e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
122f0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
12300 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
12310 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
12320 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  }.  testcase( pg
12330 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
12340 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
12350 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
12360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
12370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
12380 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
12390 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
123a0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
123b0 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
123c0 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
123d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20  .**.** Page1 is 
123e0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 61  a special case a
123f0 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61  nd must be relea
12400 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73  sed using releas
12410 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73  ePageOne()..*/.s
12420 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12430 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
12440 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12470 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
12480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12490 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
124a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
124c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
124d0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
124e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
124f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12510 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
12520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12540 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12550 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
12560 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
12570 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12580 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12590 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
125a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
125b0 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
125c0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
125d0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
125e0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
125f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12600 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12610 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
12620 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
12630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12640 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
12650 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
12660 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12670 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12680 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
12690 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
126a0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
126b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
126c0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
126d0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
126e0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
126f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
12720 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12730 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70  PageOne(pPage->p
12740 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
12750 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
12760 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
12770 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
12780 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
12790 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
127a0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
127b0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
127c0 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
127d0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
127e0 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
127f0 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
12800 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
12810 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
12820 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
12830 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
12840 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
12850 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
12860 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
12870 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
12880 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
12890 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
128a0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
128b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
128c0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
128d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
128e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
128f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
12900 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
12910 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
12930 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12940 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12950 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12960 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
12970 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
12980 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
12990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
129a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
129b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
129c0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
129d0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
129e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
129f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12a00 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
12a40 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
12a50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
12a60 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
12a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a80 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
12a90 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
12aa0 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
12ab0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
12ac0 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
12ad0 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
12ae0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
12af0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
12b00 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
12b10 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
12b20 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
12b30 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
12b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12b50 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
12b60 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
12b70 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
12b80 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
12b90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
12ba0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
12bb0 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12bc0 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
12bd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
12be0 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
12bf0 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
12c00 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
12c10 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
12c20 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
12c30 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
12c40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
12c50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12c60 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
12c70 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
12c80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12ca0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
12cc0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
12cd0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12ce0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12cf0 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
12d00 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
12d10 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
12d20 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
12d30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
12d40 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
12d50 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
12d60 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
12d70 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
12d80 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
12d90 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
12da0 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
12db0 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
12dc0 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
12dd0 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
12de0 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
12df0 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
12e00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
12e10 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
12e20 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
12e30 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
12e40 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
12e50 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
12e60 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
12e70 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
12e80 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
12e90 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
12ea0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12eb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ec0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
12ed0 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
12ee0 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
12ef0 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
12f00 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
12f10 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
12f20 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
12f30 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
12f40 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12f60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12f70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
12f80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
12f90 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
12fa0 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
12fb0 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20  syHandler,.     
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fe0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
12ff0 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a  t->pPager));.}..
13000 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
13010 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
13020 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
13030 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13040 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13050 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
13060 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
13070 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13080 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
13090 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
130a0 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
130b0 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
130c0 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
130d0 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
130e0 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
130f0 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
13100 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
13110 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
13120 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
13130 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
13140 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
13150 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
13160 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
13170 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
13180 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
13190 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
131a0 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
131b0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
131c0 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
131d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
131e0 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
131f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
13200 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
13210 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
13220 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
13230 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
13240 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
13250 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
13260 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
13270 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
13280 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
13290 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
132a0 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
132b0 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
132c0 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
132d0 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
132e0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
132f0 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
13300 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
13310 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
13320 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
13330 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
13340 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
13350 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
13360 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
13370 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
13380 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13390 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
133a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
133b0 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
133c0 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
133d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
133e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
133f0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13400 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
13410 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
13420 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
13440 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
13450 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
13460 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
13470 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13480 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
13490 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
134a0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
134b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
134c0 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
134d0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
134e0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
134f0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
13500 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
13510 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
13520 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13540 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
13550 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
13560 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
13590 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
135a0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
135b0 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
135c0 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
135d0 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
135e0 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
135f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13610 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
13620 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
13630 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
13660 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
13670 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
13680 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
13690 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
136a0 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
136b0 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
136c0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
136d0 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
136e0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
136f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
13700 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
13710 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
13720 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
13730 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
13740 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
13750 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
13760 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
13770 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
13780 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
13790 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
137a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
137b0 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
137c0 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
137d0 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
137e0 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
137f0 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
13800 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
13810 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
13840 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
13850 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
13880 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
13890 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
138a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
138b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
138c0 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
138d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
138e0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
138f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
13900 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
13910 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
13920 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
13930 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
13940 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
13950 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
13960 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
13970 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
13980 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
13990 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
139a0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
139b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
139c0 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
139d0 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
139e0 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
139f0 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
13a00 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
13a10 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
13a20 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
13a30 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
13a40 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
13a50 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
13a60 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
13a70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
13a80 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
13a90 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
13aa0 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
13ab0 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
13ac0 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
13ad0 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
13ae0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
13af0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
13b00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
13b10 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
13b20 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
13b30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
13b40 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  KPT;.  }.  p->in
13b50 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13b60 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
13b70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13b80 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13b90 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
13ba0 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
13bb0 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
13bc0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
13bd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13be0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13bf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c00 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13c10 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
13c20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
13c30 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
13c40 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
13c50 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
13c60 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
13c70 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
13c80 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
13c90 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d    if( isTempDb==
13ca0 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30  0 && (isMemdb==0
13cb0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51   || (vfsFlags&SQ
13cc0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d  LITE_OPEN_URI)!=
13cd0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66  0) ){.    if( vf
13ce0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
13cf0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
13d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
13d10 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
13d20 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
13d30 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e  ame)+1;.      in
13d40 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
13d50 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
13d60 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
13d70 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
13d80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
13d90 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  MAX(nFullPathnam
13da0 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  e,nFilename));. 
13db0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
13dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
13dd0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
13de0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
13df0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
13e00 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
13e10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13e20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13e30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13e40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13e60 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
13e70 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
13e80 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
13e90 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
13ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13eb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13ec0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
13ed0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
13ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
13f10 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
13f20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
13f30 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
13f40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13f50 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13f70 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
13fa0 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
13fb0 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
13fc0 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
13fd0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13fe0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
13ff0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
14000 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
14010 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
14020 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
14030 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14040 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14050 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
14060 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14070 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
14080 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
14090 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
140a0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
140b0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
140c0 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
140d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
140e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
140f0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
14100 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
14110 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
14120 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
14130 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
14140 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
14150 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
14160 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
14170 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
14180 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
14190 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
141a0 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
141b0 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
141c0 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
141d0 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
141e0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
141f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14200 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
14210 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
14220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14240 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14260 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14270 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
142a0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
142b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
142c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
142d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
142e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
142f0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
14300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14310 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
14320 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
14330 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
14340 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14370 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14380 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
14390 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
143a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
143b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
143c0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
143d0 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
143e0 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
143f0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
14400 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
14410 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
14420 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
14430 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
14440 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
14450 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
14460 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
14470 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
14480 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
14490 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
144a0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
144b0 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
144c0 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
144d0 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
144e0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
144f0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
14500 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
14510 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
14520 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
14530 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
14540 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
14550 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
14560 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
14570 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
14580 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
14590 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
145a0 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
145b0 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
145c0 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
145d0 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
145e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
145f0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
14600 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
14610 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
14620 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
14630 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
14640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14650 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
14660 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14670 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
14680 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
14690 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
146a0 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
146b0 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
146c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
146d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
146e0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
146f0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
14700 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14710 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
14720 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
14730 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61      sizeof(MemPa
14760 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  ge), flags, vfsF
14770 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
14780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
147a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
147b0 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
147c0 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d  pPager, db->szMm
147d0 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
147e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
147f0 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
14800 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
14810 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
14820 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
14830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14840 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
14850 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
14860 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70     }.    pBt->op
14870 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c  enFlags = (u8)fl
14880 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  ags;.    pBt->db
14890 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
148a0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 48 61  e3PagerSetBusyHa
148b0 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
148c0 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
148d0 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
148e0 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
148f0 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70  t;.  .    pBt->p
14900 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
14910 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
14920 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14930 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
14940 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70  pBt->pPager) ) p
14950 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14960 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23  BTS_READ_ONLY;.#
14970 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14980 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  E_SECURE_DELETE)
14990 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
149a0 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
149b0 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64  _DELETE;.#elif d
149c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41  efined(SQLITE_FA
149d0 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  ST_SECURE_DELETE
149e0 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ).    pBt->btsFl
149f0 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57  ags |= BTS_OVERW
14a00 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  RITE;.#endif.   
14a10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14a20 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
14a30 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
14a40 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
14a50 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
14a60 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
14a70 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
14a80 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
14a90 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
14aa0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
14ab0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
14ac0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
14ad0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14ae0 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
14af0 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
14b00 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
14b10 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
14b20 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
14b30 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
14b40 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
14b50 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
14b60 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
14b70 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
14b80 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
14b90 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
14ba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14bb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
14bc0 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
14bd0 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
14be0 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
14bf0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14c00 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
14c10 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
14c20 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
14c30 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
14c40 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
14c50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
14c60 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14c70 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
14c80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
14c90 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14ca0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
14cb0 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
14cc0 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
14cd0 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
14ce0 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
14cf0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
14d00 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
14d10 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
14d20 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
14d30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
14d40 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
14d50 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
14d60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14d70 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14d80 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
14d90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
14da0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14db0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14dc0 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
14dd0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
14de0 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
14df0 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
14e00 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
14e10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
14e20 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
14e30 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
14e40 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
14e50 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
14e60 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
14e70 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
14e80 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
14e90 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
14ea0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
14eb0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
14ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
14ed0 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
14ee0 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
14ef0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14f00 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14f20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14f30 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14f40 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14f50 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14f60 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
14f70 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14f80 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f90 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
14fa0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14fb0 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
14fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14fd0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14fe0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14ff0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
15000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
15010 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
15020 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
15030 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
15040 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
15050 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
15060 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
15070 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
15080 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
15090 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
150a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
150b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
150c0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
150d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
150e0 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
150f0 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
15100 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
15110 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
15120 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
15130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74  ..    */.    pBt
15140 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
15150 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
15160 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
15170 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
15180 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
15190 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ; ).      MUTEX_
151a0 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
151b0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
151c0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
151d0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
151e0 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
151f0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15200 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
15210 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
15220 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
15230 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
15240 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
15250 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
15260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
15270 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
15280 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15290 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
152a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
152b0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
152c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
152d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
152e0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
152f0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
15300 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
15310 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15320 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15330 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
15340 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15350 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15360 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
15370 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15380 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
15390 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
153a0 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
153b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
153c0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
153d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
153e0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
153f0 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
15400 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
15410 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
15420 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
15430 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
15440 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
15450 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
15460 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
15470 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
15480 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
15490 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
154a0 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
154b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
154c0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
154d0 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
154e0 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
154f0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
15500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15510 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
15520 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
15530 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
15540 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15550 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
15560 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
15570 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
15580 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70  (uptr)p->pBt<(up
15590 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  tr)pSib->pBt ){.
155a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
155b0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
155c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
155d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
155e0 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
155f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15600 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
15610 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70  ib->pNext && (up
15620 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  tr)pSib->pNext->
15630 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74  pBt<(uptr)p->pBt
15640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15650 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
15660 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
15670 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
15680 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
15690 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
156a0 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
156b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
156c0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
156d0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
156e0 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
156f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
15700 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
15710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15720 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15730 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15740 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
15750 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
15760 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
15770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15780 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
15790 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
157a0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
157b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a  Bt->pPager, 0);.
157c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
157d0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
157e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
157f0 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
15800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
15810 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
15820 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  File;..    /* If
15830 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
15840 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
15850 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
15860 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
15870 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
15880 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
15890 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
158a0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
158b0 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
158c0 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
158d0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
158e0 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
158f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
15900 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
15910 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
15920 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15930 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
15940 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
15950 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
15960 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
15970 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c  .    pFile = sql
15980 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
15990 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
159a0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
159b0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ods ){.      sql
159c0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
159d0 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c  lHint(pFile, SQL
159e0 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28  ITE_FCNTL_PDB, (
159f0 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b  void*)&pBt->db);
15a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15a10 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
15a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15a30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
15a40 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
15a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a60 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
15a70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
15a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
15a90 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63  lite3BtreeConnec
15aa0 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72  tionCount(*ppBtr
15ab0 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72  ee)>0 );.  retur
15ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
15ad0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
15ae0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
15af0 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
15b00 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
15b10 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
15b20 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
15b30 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
15b40 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
15b50 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
15b60 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
15b70 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
15b80 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
15b90 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
15ba0 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
15bb0 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
15bc0 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
15bd0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
15be0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15bf0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15c00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
15c10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
15c20 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72  ster; ).  BtShar
15c30 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
15c40 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
15c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15c60 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
15c70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15c80 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
15c90 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
15ca0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
15cb0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
15cc0 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
15cd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
15ce0 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
15cf0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
15d00 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
15d10 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
15d20 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15d30 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
15d40 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
15d50 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15d60 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15d70 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
15d80 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
15d90 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
15da0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15db0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15dc0 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
15dd0 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
15de0 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
15df0 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
15e00 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
15e10 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
15e20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
15e30 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
15e40 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
15e50 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
15e60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15e70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
15e80 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
15e90 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
15ea0 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
15eb0 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
15ec0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
15ed0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
15ee0 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
15ef0 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
15f00 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
15f10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
15f20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
15f30 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
15f40 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
15f50 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
15f60 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20  pBt) bytes with 
15f70 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20  a 4-byte prefix 
15f80 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64  for a left-child
15f90 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  .** pointer..*/.
15fa0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
15fb0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
15fc0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
15fd0 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
15fe0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
15ff0 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
16000 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
16010 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
16020 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  .    /* One of t
16030 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e  he uses of pBt->
16040 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20  pTmpSpace is to 
16050 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66  format cells bef
16060 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ore.    ** inser
16070 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61  ting them into a
16080 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63   leaf page (func
16090 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  tion fillInCell(
160a0 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  )). If.    ** a 
160b0 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  cell is less tha
160c0 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 4 bytes in siz
160d0 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64  e, it is rounded
160e0 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20   up to 4 bytes. 
160f0 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72     ** by the var
16100 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68  ious routines th
16110 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69  at manipulate bi
16120 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63  nary cells. Whic
16130 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61  h.    ** can mea
16140 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c  n that fillInCel
16150 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c  l() only initial
16160 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32  izes the first 2
16170 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74   or 3.    ** byt
16180 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c  es of pTmpSpace,
16190 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69   but that the fi
161a0 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20  rst 4 bytes are 
161b0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20  copied from.    
161c0 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74  ** it into a dat
161d0 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73  abase page. This
161e0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
161f0 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20   a problem, but 
16200 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63  it.    ** does c
16210 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20  ause a valgrind 
16220 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31  error when the 1
16230 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75   or 2 bytes of u
16240 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
16250 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65  ** data is passe
16260 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c  d to system call
16270 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20   write(). So to 
16280 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72  avoid this error
16290 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68  ,.    ** zero th
162a0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
162b0 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65  of temp space he
162c0 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  re..    **.    *
162d0 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65  * Also:  Provide
162e0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
162f0 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
16300 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
16310 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  ** beginning of 
16320 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20  pTmpSpace as an 
16330 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74  area available t
16340 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20  o prepend the.  
16350 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20    ** left-child 
16360 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
16370 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65  eginning of a ce
16380 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
16390 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
163a0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  e ){.      memse
163b0 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
163c0 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70  , 0, 8);.      p
163d0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d  Bt->pTmpSpace +=
163e0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   4;.    }.  }.}.
163f0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
16400 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
16410 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
16420 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
16430 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
16440 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
16450 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
16460 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
16470 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69  e -= 4;.    sqli
16480 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d  te3PageFree(pBt-
16490 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
164a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
164b0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
164c0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
164d0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
164e0 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
164f0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
16500 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
16510 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
16520 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16530 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
16540 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
16550 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
16560 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
16570 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
16580 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16590 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
165a0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
165b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
165c0 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
165d0 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
165e0 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
165f0 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
16600 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
16610 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
16620 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
16630 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
16640 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
16650 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
16660 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
16670 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
16680 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
16690 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
166a0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
166b0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
166c0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
166d0 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
166e0 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
166f0 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
16700 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
16710 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
16720 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
16730 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16740 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
16750 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
16760 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
16770 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
16780 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16790 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
167a0 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
167b0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
167c0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
167d0 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
167e0 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
167f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
16800 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
16810 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
16820 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
16830 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
16840 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
16850 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
16860 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
16870 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
16880 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
16890 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
168a0 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
168b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
168c0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
168d0 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
168e0 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
168f0 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
16900 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
16910 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
16920 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16930 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
16940 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  r, p->db);.    i
16950 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
16960 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
16970 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
16980 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
16990 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
169a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
169b0 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63  Free(0, pBt->pSc
169c0 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
169d0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
169e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
169f0 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
16a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16a10 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
16a20 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
16a30 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
16a40 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
16a50 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
16a60 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
16a70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16a80 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
16a90 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
16aa0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
16ab0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
16ac0 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
16ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16ae0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16af0 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e   "soft" limit on
16b00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16b10 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
16b20 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64  e..** Unused and
16b30 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65   unmodified page
16b40 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c  s will be recycl
16b50 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed when the numb
16b60 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69  er of.** pages i
16b70 6e 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65  n the cache exce
16b80 65 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69  eds this soft li
16b90 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69  mit.  But the si
16ba0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63  ze of the.** cac
16bb0 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  he is allowed to
16bc0 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61   grow larger tha
16bd0 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20  n this limit if 
16be0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64  it contains.** d
16bf0 69 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61  irty pages or pa
16c00 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74  ges still in act
16c10 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  ive use..*/.int 
16c20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
16c30 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
16c40 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
16c50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16c60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16c70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16c80 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16c90 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16ca0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16cc0 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
16cd0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
16ce0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16cf0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16d10 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16d20 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f   "spill" limit o
16d30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16d40 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
16d50 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  he..** If the nu
16d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78  mber of pages ex
16d70 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74  ceeds this limit
16d80 20 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20   during a write 
16d90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
16da0 74 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20  the pager might 
16db0 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c  attempt to "spil
16dc0 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  l" pages to the 
16dd0 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e  journal early in
16de0 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65  .** order to fre
16df0 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  e up memory..**.
16e00 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
16e10 75 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72  urned is the cur
16e20 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
16e30 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73    If zero is pas
16e40 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67  sed.** as an arg
16e50 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65  ument, no change
16e60 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
16e70 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74  e spill size set
16e80 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e  ting, so.** usin
16e90 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73  g mxPage of 0 is
16ea0 20 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20   a way to query 
16eb0 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
16ec0 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l size..*/.int s
16ed0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70  qlite3BtreeSetSp
16ee0 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70  illSize(Btree *p
16ef0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16f00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16f10 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
16f20 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  es;.  assert( sq
16f30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16f40 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16f50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16f60 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20  Enter(p);.  res 
16f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
16f80 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e  tSpillsize(pBt->
16f90 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
16fa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16fb0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16fc0 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51  n res;.}..#if SQ
16fd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
16fe0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
16ff0 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
17000 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
17010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
17020 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
17030 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
17040 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17050 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
17060 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
17070 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
17080 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17090 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
170a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
170b0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
170c0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
170d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
170e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
170f0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
17100 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
17110 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17120 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
17140 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
17150 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
17160 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17170 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
17180 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
17190 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
171a0 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
171b0 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
171c0 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
171d0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
171e0 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
171f0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
17200 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
17210 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
17220 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
17230 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
17240 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
17250 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17260 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
17270 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
17280 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
17290 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
172a0 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
172b0 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
172c0 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
172d0 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
172e0 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
172f0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
17300 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
17310 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
17320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17330 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
17340 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
17350 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
17360 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
17370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17380 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
17390 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
173a0 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
173b0 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
173c0 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
173d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
173e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
173f0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17410 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17420 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17430 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
17440 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
17450 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
17460 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
17470 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17480 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17490 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
174a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
174b0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
174c0 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
174d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
174e0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
174f0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
17500 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
17510 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
17520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
17530 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
17540 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
17550 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
17560 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
17570 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
17580 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
17590 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
175a0 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
175b0 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
175c0 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
175d0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
175e0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
175f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
17600 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
17610 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
17620 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
17630 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
17640 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
17650 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
17660 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
17670 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
17680 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
17690 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
176a0 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
176b0 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
176c0 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
176d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
176e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
176f0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
17700 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
17710 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
17720 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
17730 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
17740 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
17750 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
17760 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
17770 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
17780 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
17790 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
177a0 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
177b0 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
177c0 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
177d0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
177e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
177f0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
17800 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
17810 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17820 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
17830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17840 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
17850 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17860 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
17870 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
17880 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
17890 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
178a0 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
178b0 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65  ODEC.  if( nRese
178c0 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  rve>pBt->optimal
178d0 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f  Reserve ) pBt->o
178e0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20  ptimalReserve = 
178f0 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65  (u8)nReserve;.#e
17900 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e  ndif.  if( pBt->
17910 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
17920 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
17930 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17940 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
17950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17960 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
17970 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
17980 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
17990 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
179a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
179b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
179c0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
179d0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
179e0 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
179f0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
17a00 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
17a10 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
17a20 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
17a30 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
17a40 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
17a50 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
17a60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
17a70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
17a80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
17a90 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
17aa0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
17ab0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
17ac0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
17ad0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
17ae0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
17af0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
17b00 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
17b10 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
17b20 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
17b30 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
17b40 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17b50 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
17b60 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
17b70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17b90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
17ba0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
17bb0 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
17bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17bd0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
17be0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
17bf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
17c00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17c10 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
17c20 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
17c30 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
17c40 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
17c50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
17c60 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
17c70 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17c80 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
17c90 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
17ca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
17cb0 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
17cc0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
17cd0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
17ce0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
17cf0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
17d00 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
17d10 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
17d20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
17d30 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
17d40 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
17d50 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
17d60 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
17d70 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
17d80 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
17d90 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
17da0 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
17db0 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
17dc0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
17dd0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
17de0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
17df0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
17e00 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
17e10 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
17e20 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
17e30 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
17e40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17e50 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
17e60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d  >mutex) );.  n =
17e70 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
17e80 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
17e90 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  leSize;.  return
17ea0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
17eb0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17ec0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
17ed0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
17ee0 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
17ef0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
17f00 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
17f10 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
17f20 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
17f30 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
17f40 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
17f50 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ions..**.** If S
17f60 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20  QLITE_HAS_MUTEX 
17f70 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
17f80 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  the number retur
17f90 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72  ned is the.** gr
17fa0 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72  eater of the cur
17fb0 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70  rent reserved sp
17fc0 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ace and the maxi
17fd0 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  mum requested.**
17fe0 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a   reserve space..
17ff0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18000 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
18010 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
18020 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
18030 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18040 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74  .  n = sqlite3Bt
18050 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
18060 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20  utex(p);.#ifdef 
18070 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18080 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d  .  if( n<p->pBt-
18090 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
180a0 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70  ) n = p->pBt->op
180b0 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65  timalReserve;.#e
180c0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74  ndif.  sqlite3Bt
180d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
180e0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
180f0 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
18100 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
18110 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
18120 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
18130 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
18140 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
18150 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
18160 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
18170 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
18180 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
18190 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
181a0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
181b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
181c0 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
181d0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
181e0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
181f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18200 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
18210 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
18220 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
18230 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
18240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
18260 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
18270 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74  the values for t
18280 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
18290 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45  LETE and BTS_OVE
182a0 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a  RWRITE flags:.**
182b0 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
182c0 30 20 20 20 20 20 20 20 42 6f 74 68 20 42 54 53  0       Both BTS
182d0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
182e0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
182f0 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
18300 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20     newFlag==1   
18310 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44      BTS_SECURE_D
18320 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42 54  ELETE set and BT
18330 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 63  S_OVERWRITE is c
18340 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
18350 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54  Flag==2       BT
18360 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18370 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f  cleared and BTS_
18380 4f 56 45 52 57 52 49 54 45 20 69 73 20 73 65 74  OVERWRITE is set
18390 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
183a0 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67  (-1)    No chang
183b0 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  es.**.** This ro
183c0 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20  utine acts as a 
183d0 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67  query if newFlag
183e0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
183f0 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54  ro.**.** With BT
18400 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c  S_OVERWRITE set,
18410 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
18420 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
18430 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a  by zeros, but.**
18440 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70   freelist leaf p
18450 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69  ages are not wri
18460 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
18470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 75 73   database.  Thus
18480 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65   in-page.** dele
18490 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63  ted content is c
184a0 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72 65 65  leared, but free
184b0 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e  list deleted con
184c0 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a  tent is not..**.
184d0 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43 55  ** With BTS_SECU
184e0 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61  RE_DELETE, opera
184f0 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53  tion is like BTS
18500 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74 68 20  _OVERWRITE with 
18510 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20  the addition.** 
18520 74 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65  that freelist le
18530 61 66 20 70 61 67 65 73 20 61 72 65 20 77 72 69  af pages are wri
18540 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
18550 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63  he database, inc
18560 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61  reasing.** the a
18570 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f  mount of disk I/
18580 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  O..*/.int sqlite
18590 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
185a0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
185b0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
185c0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
185d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
185e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
185f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53  );.  assert( BTS
18600 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f  _OVERWRITE==BTS_
18610 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20  SECURE_DELETE*2 
18620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53  );.  assert( BTS
18630 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42  _FAST_SECURE==(B
18640 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53  TS_OVERWRITE|BTS
18650 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20  _SECURE_DELETE) 
18660 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
18670 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
18680 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
18690 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b  BTS_FAST_SECURE;
186a0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
186b0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
186c0 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c  URE_DELETE*newFl
186d0 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70  ag;.  }.  b = (p
186e0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
186f0 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  & BTS_FAST_SECUR
18700 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E)/BTS_SECURE_DE
18710 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42  LETE;.  sqlite3B
18720 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18730 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
18740 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
18750 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
18760 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
18770 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
18780 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
18790 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
187a0 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
187b0 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
187c0 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
187d0 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
187e0 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
187f0 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
18800 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
18810 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
18820 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
18830 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
18840 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
18850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18860 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
18870 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
18880 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
18890 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
188a0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
188b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
188c0 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
188d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
188e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
188f0 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
18900 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
18910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18920 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
18930 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
18940 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
18950 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
18960 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
18970 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
18980 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
18990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
189a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
189b0 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
189c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
189d0 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
189e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
189f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18a00 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
18a10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
18a20 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
18a30 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18a40 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
18a50 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
18a60 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
18a70 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
18a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18a90 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
18aa0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
18ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18ac0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18ad0 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
18ae0 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
18af0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
18b00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18b10 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
18b20 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
18b30 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
18b40 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
18b50 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
18b60 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
18b70 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
18b80 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18b90 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
18ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18bb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
18bc0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
18bd0 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e  f the user has n
18be0 6f 74 20 73 65 74 20 74 68 65 20 73 61 66 65 74  ot set the safet
18bf0 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73  y-level for this
18c00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
18c10 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50  tion.** using "P
18c20 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
18c30 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73  s", and if the s
18c40 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e  afety-level is n
18c50 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  ot already.** se
18c60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  t to the value p
18c70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
18c80 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65  nction as the se
18c90 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a  cond parameter,.
18ca0 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f  ** set it so..*/
18cb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
18cc0 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21  ULT_SYNCHRONOUS!
18cd0 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  =SQLITE_DEFAULT_
18ce0 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20  WAL_SYNCHRONOUS 
18cf0 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e 65  \.    && !define
18d00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
18d10 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  L).static void s
18d20 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18d30 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  g(BtShared *pBt,
18d40 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c   u8 safety_level
18d50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18d60 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69  ;.  Db *pDb;.  i
18d70 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18d80 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
18d90 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68  Db)!=0 ){.    wh
18da0 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30  ile( pDb->pBt==0
18db0 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42   || pDb->pBt->pB
18dc0 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b  t!=pBt ){ pDb++;
18dd0 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e   }.    if( pDb->
18de0 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20  bSyncSet==0 .   
18df0 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79    && pDb->safety
18e00 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c  _level!=safety_l
18e10 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44  evel .     && pD
18e20 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a  b!=&db->aDb[1] .
18e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62      ){.      pDb
18e40 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
18e50 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20   safety_level;. 
18e60 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18e70 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
18e80 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
18e90 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
18ea0 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20  el | (db->flags 
18eb0 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41  & PAGER_FLAGS_MA
18ec0 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  SK));.    }.  }.
18ed0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
18ee0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
18ef0 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c  lag(pBt,safety_l
18f00 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  evel).#endif../*
18f10 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
18f20 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
18f30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f40 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
18f50 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
18f60 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
18f70 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
18f80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18f90 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
18fa0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
18fb0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
18fc0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
18fd0 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
18fe0 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
18ff0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
19000 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
19010 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19020 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
19030 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
19040 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
19050 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
19060 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
19070 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
19080 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
19090 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
190a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
190b0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
190c0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
190d0 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
190e0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
190f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19100 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
19110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19120 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
19130 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
19140 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
19150 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19160 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19170 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
19180 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
19190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
191a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
191b0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
191c0 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
191d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
191e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
191f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
19200 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
19210 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
19220 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
19230 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
19240 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19250 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
19260 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
19270 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
19280 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
19290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
192a0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
192b0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
192c0 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
192d0 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
192e0 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
192f0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
19300 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
19310 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
19320 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
19330 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
19340 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
19350 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19360 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
19370 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
19380 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
19390 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
193a0 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
193b0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
193c0 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
193d0 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
193e0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
193f0 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
19400 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
19410 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
19420 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
19430 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
19440 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
19450 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  B;.    /* EVIDEN
19460 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33  CE-OF: R-43737-3
19470 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64  9999 Every valid
19480 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
19490 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20   file begins.   
194a0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c   ** with the fol
194b0 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20  lowing 16 bytes 
194c0 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20  (in hex): 53 51 
194d0 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36  4c 69 74 65 20 6
194e0 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a  6 6f 72 6d.    *
194f0 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30  * 61 74 20 33 00
19500 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d  . */.    if( mem
19510 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
19520 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
19530 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19540 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19550 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
19560 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
19570 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
19580 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
19590 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
195a0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
195b0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
195c0 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
195d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
195e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c  ailed;.    }.#el
195f0 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  se.    if( page1
19600 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [18]>2 ){.      
19610 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19620 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19640 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20  ge1[19]>2 ){.   
19650 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19660 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19670 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
19680 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73  write version is
19690 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20   set to 2, this 
196a0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
196b0 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20  be accessed.    
196c0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
196d0 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f  If the log is no
196e0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
196f0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65  open it now. The
19700 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  n .    ** return
19710 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
19720 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f  eturn without po
19730 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65  pulating BtShare
19740 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a  d.pPage1..    **
19750 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65   The caller dete
19760 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c  cts this and cal
19770 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
19780 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a   again. This is.
19790 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
197a0 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  as the version o
197b0 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74  f page 1 current
197c0 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20  ly in the page1 
197d0 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61  buffer.    ** ma
197e0 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74  y not be the lat
197f0 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68  est version - th
19800 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77  ere may be a new
19810 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f  er one in the lo
19820 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20  g.    ** file.. 
19830 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61     */.    if( pa
19840 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70  ge1[19]==2 && (p
19850 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
19860 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b  TS_NO_WAL)==0 ){
19870 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
19880 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
19890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
198a0 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
198b0 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
198c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
198d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
198e0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
198f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
19900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74  lse{.        set
19910 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
19920 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  pBt, SQLITE_DEFA
19930 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
19940 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  OUS+1);.        
19950 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
19960 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
19970 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
19980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
19990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
199a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
199b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
199c0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
199d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44  else{.      setD
199e0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
199f0 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
19a00 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  LT_SYNCHRONOUS+1
19a10 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
19a20 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19a30 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38  -OF: R-15465-208
19a40 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  13 The maximum a
19a50 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64  nd minimum embed
19a60 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ded payload.    
19a70 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64  ** fractions and
19a80 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61   the leaf payloa
19a90 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65  d fraction value
19aa0 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32  s must be 64, 32
19ab0 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a  , and 32..    **
19ac0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
19ad0 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
19ae0 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
19af0 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
19b00 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
19b10 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
19b20 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
19b30 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
19b40 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
19b50 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
19b60 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
19b70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19b80 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19b90 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
19ba0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
19bb0 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
19bc0 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
19bd0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
19be0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
19bf0 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
19c00 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
19c10 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
19c20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
19c30 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
19c40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19c50 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67  file. */.    pag
19c60 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
19c70 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
19c80 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a  17]<<16);.    /*
19c90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19ca0 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20  25008-21688 The 
19cb0 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69  size of a page i
19cc0 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  s a power of two
19cd0 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20  .    ** between 
19ce0 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e  512 and 65536 in
19cf0 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20  clusive. */.    
19d00 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
19d10 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
19d20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
19d30 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
19d40 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
19d50 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
19d60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19d70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19d90 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
19da0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
19db0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19dc0 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
19dd0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
19de0 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
19df0 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
19e00 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
19e10 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19e20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
19e30 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
19e40 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
19e50 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
19e60 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
19e70 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
19e80 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
19e90 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
19ea0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
19eb0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
19ec0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
19ed0 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
19ee0 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
19ef0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
19f00 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
19f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19f20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
19f30 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
19f40 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
19f50 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
19f60 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
19f70 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
19f80 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
19f90 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19fa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19fb0 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
19fc0 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
19fd0 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
19fe0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
19ff0 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
1a000 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
1a010 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
1a020 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
1a030 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
1a040 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1a050 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
1a060 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1a070 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
1a080 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
1a090 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
1a0a0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
1a0b0 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
1a0c0 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
1a0d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1a0e0 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1a0f0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
1a100 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
1a110 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
1a120 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a130 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
1a140 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
1a150 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a160 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
1a170 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
1a180 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1a1b0 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
1a1c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a1d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1a1e0 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  ( (pBt->db->flag
1a1f0 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
1a200 53 63 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50  Schema)==0 && nP
1a210 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
1a220 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a230 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a240 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a250 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a260 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
1a270 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
1a280 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
1a290 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
1a2a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
1a2b0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
1a2c0 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
1a2d0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
1a2e0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
1a2f0 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
1a300 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
1a310 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
1a320 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
1a330 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
1a340 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
1a350 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a360 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
1a370 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
1a380 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
1a390 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
1a3a0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
1a3b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a3c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
1a3d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
1a3e0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1a3f0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
1a400 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
1a410 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1a420 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
1a430 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
1a440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
1a450 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
1a460 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
1a470 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
1a480 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
1a490 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
1a4a0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
1a4b0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
1a4c0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
1a4d0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
1a4e0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
1a4f0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
1a500 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
1a510 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
1a520 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
1a530 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
1a540 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
1a550 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
1a560 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
1a570 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
1a580 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
1a590 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
1a5a0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1a5b0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
1a5c0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
1a5d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
1a5e0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
1a5f0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
1a600 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
1a610 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
1a620 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
1a630 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
1a640 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
1a650 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
1a660 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
1a670 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
1a680 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
1a690 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
1a6a0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
1a6b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1a6c0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
1a6d0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
1a6e0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1a6f0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1a700 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1a710 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
1a720 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a730 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
1a740 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
1a750 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1a760 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1a770 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
1a780 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
1a790 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
1a7a0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
1a7b0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
1a7c0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
1a7d0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
1a7e0 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
1a7f0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
1a800 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
1a810 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
1a820 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
1a830 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
1a840 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1a850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
1a860 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a870 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f  :.  releasePageO
1a880 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ne(pPage1);.  pB
1a890 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1a8a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a8b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1a8c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a8d0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1a8e0 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1a8f0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1a900 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1a910 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1a920 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1a930 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1a940 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1a950 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1a960 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a970 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1a980 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1a990 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1a9a0 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1a9b0 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1a9c0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1a9d0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1a9e0 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1a9f0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1aa00 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1aa10 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1aa20 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1aa30 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1aa40 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1aa50 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1aa60 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1aa70 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1aa80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1aa90 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1aaa0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1aab0 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1aac0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1aad0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1aae0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1aaf0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1ab00 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1ab10 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1ab20 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1ab30 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1ab40 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1ab50 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1ab60 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1ab70 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1ab80 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1ab90 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1aba0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1abb0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1abc0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1abd0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1abe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1abf0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1ac00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ac10 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1ac20 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1ac30 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1ac40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ac50 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1ac60 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1ac70 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1ac80 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1ac90 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1aca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1acb0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1acc0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1acd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ace0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1acf0 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1ad00 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1ad10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ad20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1ad30 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1ad40 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1ad50 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1ad60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1ad70 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1ad80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ad90 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1ada0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1adb0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1adc0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1add0 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1ade0 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1adf0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1ae00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1ae10 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1ae20 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1ae30 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1ae40 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
1ae50 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
1ae60 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
1ae70 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
1ae80 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
1ae90 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
1aea0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
1aeb0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
1aec0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
1aed0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1aee0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1aef0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1af00 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1af10 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
1af20 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
1af30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
1af40 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
1af50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1af60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1af70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
1af80 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
1af90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1afa0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
1afb0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1afc0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
1afd0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
1afe0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
1aff0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1b000 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
1b010 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1b020 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
1b030 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
1b040 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
1b050 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
1b060 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
1b070 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
1b080 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
1b090 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1b0a0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
1b0b0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
1b0c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
1b0d0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
1b0e0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
1b0f0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
1b100 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
1b110 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
1b120 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
1b130 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
1b140 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
1b150 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
1b160 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
1b170 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
1b180 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
1b190 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
1b1a0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
1b1b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
1b1c0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
1b1d0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
1b1e0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
1b1f0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
1b200 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
1b210 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
1b220 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
1b230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b240 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
1b250 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1b260 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
1b270 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
1b280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b290 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
1b2a0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
1b2b0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
1b2c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
1b2d0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
1b2e0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
1b2f0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
1b300 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
1b310 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
1b320 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
1b330 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
1b340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1b360 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
1b370 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1b380 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
1b390 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
1b3a0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
1b3b0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
1b3c0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
1b3d0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
1b3e0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
1b3f0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1b400 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1b410 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
1b420 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1b430 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
1b440 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1b450 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b460 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
1b470 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
1b480 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
1b490 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b4a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b4c0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
1b4d0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1b4e0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
1b4f0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
1b500 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
1b510 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1b520 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
1b530 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
1b540 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
1b550 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b560 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
1b570 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
1b580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b590 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
1b5a0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
1b5b0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
1b5c0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
1b5d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
1b5e0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1b5f0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1b600 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1b610 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1b620 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1b630 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1b640 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1b650 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1b660 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1b670 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1b680 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1b690 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1b6a0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1b6b0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1b6c0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1b6d0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1b6e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b6f0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1b700 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1b710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1b720 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1b730 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1b740 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1b750 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b760 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1b770 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1b780 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1b790 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b7a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1b7b0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b7c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1b7d0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1b7e0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1b7f0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b800 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1b810 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1b820 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1b830 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1b840 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1b850 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1b860 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1b870 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1b880 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1b890 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1b8a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1b8b0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1b8c0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1b8d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1b8e0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1b8f0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1b900 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1b910 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1b920 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1b930 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1b940 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1b950 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1b960 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1b970 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1b980 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1b990 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1b9a0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1b9b0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1b9c0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1b9d0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1b9e0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1b9f0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1ba00 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1ba10 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1ba20 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1ba30 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1ba40 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1ba50 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1ba60 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1ba70 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1ba80 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1ba90 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1baa0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1bab0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1bac0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1bad0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1bae0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1baf0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1bb00 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1bb10 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1bb20 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1bb30 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1bb40 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1bb50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bb60 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1bb70 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1bb80 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
1bb90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1bba0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bbb0 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1bbc0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1bbd0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1bbe0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1bbf0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1bc00 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1bc10 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1bc20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1bc30 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1bc40 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1bc50 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1bc60 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1bc70 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1bc80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1bc90 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1bca0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1bcb0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1bcc0 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1bcd0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1bce0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bcf0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bd00 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1bd10 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1bd20 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1bd30 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1bd40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1bd50 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1bd60 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1bd70 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1bd80 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1bd90 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1bda0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1bdb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1bdc0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1bdd0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1bde0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1bdf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1be00 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1be10 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1be20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1be30 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1be40 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1be50 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1be60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1be70 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1be80 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1be90 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1bea0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1beb0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1bec0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1bed0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1bee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1bef0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1bf00 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1bf10 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1bf20 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1bf30 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1bf40 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1bf50 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1bf60 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1bf70 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1bf80 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1bf90 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1bfa0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1bfb0 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1bfc0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1bfd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1bfe0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1c000 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1c010 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1c020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c030 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c040 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1c050 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c060 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1c070 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1c080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1c090 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1c0a0 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1c0b0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c0c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c0d0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1c0e0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1c0f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1c100 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1c110 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1c120 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1c130 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1c140 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1c150 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1c160 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1c170 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1c180 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1c190 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1c1a0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1c1b0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1c1c0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1c1d0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1c1e0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1c1f0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1c200 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1c210 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1c220 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1c230 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1c240 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1c250 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1c260 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1c270 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1c280 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1c290 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1c2a0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1c2b0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1c2c0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1c2d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1c2e0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1c2f0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1c300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1c310 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1c320 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1c330 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1c340 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1c350 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1c360 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1c370 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1c380 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1c390 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1c3a0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1c3b0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1c3c0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1c3d0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1c3e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1c3f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1c400 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1c410 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1c420 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1c430 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1c440 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1c450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c460 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1c470 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1c480 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1c490 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1c4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1c4b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1c4c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1c4d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1c4e0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1c4f0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1c500 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1c510 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1c520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c540 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1c550 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1c560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1c570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1c590 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1c5a0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1c5b0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1c5c0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1c5d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1c5e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1c5f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1c600 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1c610 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 20 20  ndler(pBt) );.  
1c620 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 73 65  sqlite3PagerRese
1c630 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42 74  tLockTimeout(pBt
1c640 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  ->pPager);..  if
1c650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c660 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1c670 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1c680 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1c690 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1c6a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c6b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1c6c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1c6d0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1c6e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1c6f0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1c700 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1c710 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1c720 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1c730 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1c740 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1c750 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1c760 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1c770 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1c780 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1c790 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1c7a0 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1c7b0 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1c7c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1c7d0 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1c7e0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1c7f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c800 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1c810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1c820 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1c830 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1c840 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1c850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c860 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c870 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1c880 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1c890 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1c8a0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1c8b0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c8c0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1c8d0 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1c8e0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1c8f0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1c900 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1c910 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1c920 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1c930 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1c940 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1c950 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1c960 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1c970 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1c980 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1c990 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1c9a0 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1c9b0 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1c9c0 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1c9d0 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1c9e0 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1c9f0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1ca00 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1ca10 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1ca20 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1ca30 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1ca40 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1ca50 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1ca60 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1ca70 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1ca80 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1ca90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1caa0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1cab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1cac0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1cad0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1cae0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1caf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1cb00 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1cb10 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1cb20 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1cb30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cb40 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1cb50 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1cb60 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1cb70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1cb80 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1cb90 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1cba0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1cbb0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1cbc0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1cbd0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1cbe0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1cbf0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1cc00 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1cc10 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1cc20 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1cc30 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1cc40 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1cc50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cc60 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1cc70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1cc80 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1cc90 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1cca0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1ccb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ccc0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ccd0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1cce0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ccf0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1cd00 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1cd10 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1cd20 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1cd30 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1cd40 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1cd50 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1cd60 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1cd70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1cd80 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1cd90 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1cda0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1cdb0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1cdc0 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1cdd0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1cde0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1ce10 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1ce20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ce50 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1ce60 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1ce70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce90 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1cea0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ceb0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1cec0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1ced0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1cee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cef0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1cf00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1cf10 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1cf20 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1cf30 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1cf40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1cf50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1cf60 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1cf70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1cf80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1cf90 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1cfa0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1cfb0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1cfc0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1cfd0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1cfe0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1cff0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1d000 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1d010 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1d020 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1d030 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1d040 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1d050 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1d060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d070 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1d080 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1d090 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1d0a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1d0b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1d0c0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1d0d0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1d0e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1d0f0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1d100 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1d110 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1d120 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1d130 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1d140 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1d150 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1d160 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1d170 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1d180 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1d190 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1d1a0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1d1b0 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1d1c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1d1d0 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1d1e0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1d1f0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1d200 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1d210 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1d220 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1d230 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1d240 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1d250 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1d260 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1d270 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1d280 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2a0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1d2b0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1d2c0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1d2d0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1d2e0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1d2f0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1d300 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1d310 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1d320 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d330 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1d340 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1d350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1d360 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1d370 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1d380 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1d390 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1d3a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d3b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1d3c0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1d3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1d3e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1d3f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1d400 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1d410 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1d420 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1d430 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1d440 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1d450 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1d460 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1d470 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1d480 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1d490 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1d4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d4b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1d4c0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
1d4d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1d4e0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
1d4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1d500 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1d510 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1d520 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e      rc = pPage->
1d530 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f  isInit ? SQLITE_
1d540 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61  OK : btreeInitPa
1d550 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
1d560 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d570 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  c;.    nCell = p
1d580 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1d590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1d5a0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
1d5b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1d5c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1d5d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1d5e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d5f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
1d600 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1d610 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
1d620 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
1d630 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
1d640 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f      if( info.nLo
1d650 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
1d660 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
1d670 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  f( pCell+info.nS
1d680 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  ize > pPage->aDa
1d690 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ta+pPage->pBt->u
1d6a0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
1d6b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d6c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1d6d0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
1d6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d6f0 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1d700 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1d710 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1d720 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1d730 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1d740 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1d750 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d770 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1d780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1d790 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1d7a0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1d7b0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1d7c0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d7e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d7f0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1d800 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1d810 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1d820 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1d830 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1d840 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d850 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1d860 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d880 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
1d890 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1d8a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1d8b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1d8c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
1d8d0 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  To);.    }.  }. 
1d8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d8f0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
1d900 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1d910 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1d920 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
1d930 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
1d940 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
1d950 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
1d960 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
1d970 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
1d980 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
1d990 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1d9a0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
1d9b0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
1d9c0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
1d9d0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
1d9e0 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
1d9f0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
1da00 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
1da10 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
1da20 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
1da30 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
1da40 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
1da50 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1da60 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
1da70 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1da80 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1da90 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
1daa0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
1dab0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
1dac0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
1dad0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
1dae0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1daf0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
1db00 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1db10 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
1db20 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1db30 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
1db40 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
1db50 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1db60 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
1db70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
1db80 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
1db90 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
1dba0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1dbb0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
1dbc0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
1dbd0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
1dbe0 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
1dbf0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
1dc00 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
1dc10 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1dc20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
1dc30 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
1dc40 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
1dc50 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
1dc60 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1dc70 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1dc80 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
1dc90 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1dca0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
1dcb0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
1dcc0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
1dcd0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1dce0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1dcf0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
1dd00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1dd10 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1dd20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
1dd30 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
1dd40 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
1dd50 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
1dd60 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
1dd70 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
1dd80 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
1dd90 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
1dda0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
1ddb0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
1ddc0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
1ddd0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
1dde0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
1ddf0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
1de00 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
1de10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1de20 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
1de30 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
1de40 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
1de50 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
1de60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1de80 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
1de90 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
1dea0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
1deb0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
1dec0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
1ded0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
1dee0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
1def0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1df00 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
1df10 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1df20 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
1df30 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
1df40 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
1df50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
1df60 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
1df70 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
1df80 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1df90 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
1dfa0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
1dfb0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1dfc0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
1dfd0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
1dfe0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
1dff0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
1e000 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
1e010 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
1e020 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
1e030 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1e040 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1e050 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1e060 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1e070 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
1e080 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
1e090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1e0b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1e0d0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
1e0e0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
1e0f0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
1e100 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
1e110 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1e120 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
1e130 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
1e140 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
1e150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e190 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
1e1a0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
1e1b0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
1e1c0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
1e1d0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
1e1e0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
1e1f0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
1e200 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
1e210 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
1e220 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
1e230 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
1e240 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1e250 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1e260 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
1e270 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
1e280 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1e290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e2a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e2b0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1e2c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e2d0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
1e2e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1e2f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e300 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e310 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
1e320 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e330 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
1e340 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
1e350 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
1e360 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1e370 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
1e380 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1e390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e3a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
1e3b0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
1e3c0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
1e3d0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
1e3e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e3f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1e400 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
1e410 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
1e420 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
1e430 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1e440 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
1e450 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
1e460 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
1e470 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
1e480 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
1e490 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
1e4a0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
1e4b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1e4c0 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
1e4d0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1e4e0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
1e4f0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
1e500 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
1e510 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1e520 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
1e530 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
1e540 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
1e550 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
1e560 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1e570 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
1e580 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
1e590 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1e5a0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
1e5b0 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
1e5c0 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
1e5d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
1e5e0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
1e5f0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
1e600 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
1e610 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1e620 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
1e630 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1e640 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1e650 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
1e660 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
1e670 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
1e680 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1e690 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
1e6a0 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
1e6b0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
1e6c0 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
1e6d0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
1e6e0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
1e6f0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
1e700 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1e710 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1e720 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
1e730 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
1e740 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
1e750 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
1e760 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
1e770 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
1e780 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
1e790 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1e7a0 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
1e7b0 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
1e7c0 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
1e7d0 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
1e7e0 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
1e7f0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
1e800 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
1e810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e820 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
1e830 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
1e840 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
1e850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e860 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e870 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1e880 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
1e890 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
1e8a0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1e8b0 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
1e8c0 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1e8d0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e8e0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
1e8f0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
1e900 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
1e910 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1e920 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1e930 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
1e940 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1e950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1e960 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
1e970 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1e980 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
1e990 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
1e9a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e9c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e9d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1e9e0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1e9f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1ea00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea10 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
1ea20 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1ea30 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1ea40 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1ea50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1ea60 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
1ea70 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
1ea80 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
1ea90 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
1eaa0 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
1eab0 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
1eac0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
1ead0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
1eae0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1eaf0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1eb00 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
1eb10 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1eb20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
1eb30 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
1eb40 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
1eb50 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
1eb60 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
1eb70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1eb80 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
1eb90 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1eba0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1ebb0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1ebc0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1ebd0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1ebe0 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
1ebf0 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
1ec00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ec10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ec20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ec30 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1ec40 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
1ec50 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
1ec60 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1ec70 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
1ec80 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1ec90 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
1eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ecb0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
1ecc0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
1ecd0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
1ece0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
1ecf0 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
1ed00 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
1ed10 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
1ed20 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1ed30 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
1ed40 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
1ed50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
1ed60 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
1ed70 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1ed80 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
1ed90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1eda0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
1edb0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
1edc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1edd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ede0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1edf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ee00 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65  If bCommit is ze
1ee10 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
1ee20 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
1ee30 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
1ee40 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
1ee50 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
1ee60 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
1ee70 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
1ee80 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
1ee90 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
1eea0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
1eeb0 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74  bCommit is great
1eec0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
1eed0 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
1eee0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
1eef0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
1ef00 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
1ef10 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
1ef20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
1ef30 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
1ef40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1ef50 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1ef60 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42         eMode = B
1ef70 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20  TALLOC_LE;.     
1ef80 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b     iNear = nFin;
1ef90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1efa0 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
1efb0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1efc0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1efd0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1efe0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1eff0 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f  eePg, iNear, eMo
1f000 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
1f010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f020 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1f030 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1f040 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f050 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1f060 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1f070 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1f080 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f       }while( bCo
1f090 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e  mmit && iFreePg>
1f0a0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
1f0b0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
1f0c0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
1f0d0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
1f0e0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
1f0f0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
1f100 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
1f110 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  bCommit);.      
1f120 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1f130 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
1f140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f150 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f160 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f170 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f  }.  }..  if( bCo
1f180 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  mmit==0 ){.    d
1f190 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50  o {.      iLastP
1f1a0 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  g--;.    }while(
1f1b0 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
1f1c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f1d0 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47   || PTRMAP_ISPAG
1f1e0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1f1f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  );.    pBt->bDoT
1f200 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1f210 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
1f220 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
1f230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f240 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ../*.** The data
1f250 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74  base opened by t
1f260 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1f270 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  t is an auto-vac
1f280 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  uum database.** 
1f290 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73  nOrig pages in s
1f2a0 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ize containing n
1f2b0 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e  Free free pages.
1f2c0 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65   Return the expe
1f2d0 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  cted .** size of
1f2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1f2f0 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67   pages following
1f300 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1f310 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
1f320 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44  atic Pgno finalD
1f330 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a  bSize(BtShared *
1f340 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c  pBt, Pgno nOrig,
1f350 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20   Pgno nFree){.  
1f360 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1f390 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
1f3a0 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
1f3b0 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3d0 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
1f3e0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
1f3f0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69  ed */.  Pgno nFi
1f400 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1f410 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f420 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45  n value */..  nE
1f430 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
1f440 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72  leSize/5;.  nPtr
1f450 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
1f460 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
1f470 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
1f480 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e  try)/nEntry;.  n
1f490 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
1f4a0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
1f4b0 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
1f4c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f4d0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
1f4e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f4f0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1f500 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
1f510 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f520 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
1f530 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f540 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1f550 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n--;.  }..  retu
1f560 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nFin;.}../*.*
1f570 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1f580 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
1f590 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
1f5a0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1f5b0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
1f5c0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
1f5d0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
1f5e0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1f5f0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
1f600 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1f610 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
1f620 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
1f630 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
1f640 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
1f650 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
1f660 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
1f670 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
1f680 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
1f690 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f6a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
1f6b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1f6c0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
1f6d0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
1f6e0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
1f6f0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1f700 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1f710 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1f720 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1f730 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1f740 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1f750 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
1f760 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f770 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
1f780 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1f790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1f7a0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1f7b0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72  Pgno nOrig = btr
1f7c0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1f7d0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
1f7e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1f7f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f800 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  36]);.    Pgno n
1f810 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1f820 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1f830 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  ree);..    if( n
1f840 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20  Orig<nFin ){.   
1f850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1f860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f870 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65   }else if( nFree
1f880 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1f890 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1f8a0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1f8b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f8c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1f8d0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1f8e0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1f8f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
1f900 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1f910 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29   nFin, nOrig, 0)
1f920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f940 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1f950 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f960 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1f970 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f980 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1f990 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f9a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1f9b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f9c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f9d0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1f9e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1f9f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fa00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fa10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fa20 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
1fa30 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
1fa40 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
1fa50 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
1fa60 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61   committed for a
1fa70 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1fa80 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
1fa90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1faa0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
1fab0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
1fac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1fad0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
1fae0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1faf0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1fb00 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
1fb10 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
1fb20 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
1fb30 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
1fb40 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
1fb50 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
1fb60 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
1fb70 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
1fb80 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
1fb90 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
1fba0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
1fbb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fbc0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1fbd0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1fbe0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
1fbf0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
1fc00 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1fc10 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28  r); )..  assert(
1fc20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fc30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1fc40 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
1fc50 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1fc60 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
1fc70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1fc80 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
1fc90 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
1fca0 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1fcb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1fcc0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1fcd0 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
1fce0 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
1fcf0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
1fd00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1fd10 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1fd20 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
1fd30 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
1fd40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1fd50 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
1fd60 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
1fd70 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
1fd80 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
1fd90 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
1fda0 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
1fdb0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1fdc0 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
1fdd0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
1fde0 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
1fdf0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fe00 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
1fe10 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1fe20 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
1fe30 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
1fe40 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
1fe50 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
1fe60 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
1fe70 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
1fe80 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
1fe90 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
1fea0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
1feb0 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
1fec0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1fed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
1fee0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1fef0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1ff00 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
1ff10 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ff20 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1ff30 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
1ff40 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1ff50 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
1ff60 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
1ff70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ff80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  UPT_BKPT;.    if
1ff90 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a  ( nFin<nOrig ){.
1ffa0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1ffb0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1ffc0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1ffd0 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
1ffe0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
1fff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
20000 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
20010 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
20020 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
20030 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
20040 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
20050 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
20060 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
20070 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
20080 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20090 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
200a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
200b0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
200c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
200d0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
200e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
200f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
20100 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
20110 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20120 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
20130 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
20140 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
20150 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
20160 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
20170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
20190 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
201a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
201b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
201c0 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref>=sqlite3Page
201d0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
201e0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
201f0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
20200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20210 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
20220 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
20230 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
20240 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
20250 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20260 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
20270 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
20280 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
20290 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
202a0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
202b0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
202c0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
202d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
202e0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
202f0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
20300 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
20310 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
20320 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
20330 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
20340 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
20350 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
20360 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
20370 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
20380 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
20390 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
203a0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
203b0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
203c0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
203d0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
203e0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
203f0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
20400 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
20410 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
20420 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20430 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
20440 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
20450 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
20460 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
20470 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
20480 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
20490 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
204a0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
204b0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
204c0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
204d0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
204e0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
204f0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
20500 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
20510 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
20520 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
20530 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
20540 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
20550 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
20560 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
20570 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
20580 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
20590 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
205a0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
205b0 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
205c0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
205d0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
205e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
205f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
20600 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
20610 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
20620 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
20630 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
20640 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
20650 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
20660 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
20670 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
20680 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
20690 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
206a0 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
206b0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
206c0 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
206d0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
206e0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
206f0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
20700 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
20710 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
20720 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
20730 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
20740 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
20750 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
20760 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
20770 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
20780 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
20790 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
207a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
207b0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
207c0 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
207d0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
207e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
207f0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
20800 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
20810 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
20820 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20830 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20840 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
20850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20860 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
20870 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20880 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
20890 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
208a0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
208b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
208c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
208d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
208e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
208f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
20900 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
20910 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
20920 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
20930 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
20940 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
20950 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
20960 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
20970 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
20980 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
20990 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
209a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
209b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
209c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
209d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
209e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
209f0 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
20a00 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
20a10 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
20a20 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
20a30 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
20a40 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
20a50 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
20a60 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
20a70 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
20a80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20a90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20aa0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
20ab0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
20ac0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
20ad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20ae0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20af0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
20b00 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
20b10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
20b20 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
20b30 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
20b40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
20b50 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
20b60 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
20b70 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
20b80 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
20b90 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
20ba0 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
20bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
20bc0 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
20bd0 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
20be0 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
20bf0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20c00 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
20c10 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
20c20 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
20c30 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
20c40 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
20c50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
20c60 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
20c70 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
20c80 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
20c90 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
20ca0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
20cb0 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
20cc0 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
20cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
20ce0 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
20cf0 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
20d00 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
20d10 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
20d20 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
20d30 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
20d40 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
20d50 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
20d60 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
20d70 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
20d80 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
20d90 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
20da0 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
20db0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
20dc0 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
20dd0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
20de0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
20df0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20e00 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
20e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20e20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
20e30 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
20e40 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
20e50 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
20e60 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
20e70 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
20e80 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
20e90 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
20ea0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
20eb0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
20ec0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
20ed0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
20ee0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
20ef0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
20f00 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
20f10 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
20f20 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
20f30 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
20f40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
20f50 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
20f60 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
20f70 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
20f80 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
20f90 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
20fa0 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
20fb0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
20fc0 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
20fd0 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
20fe0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
20ff0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
21000 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21010 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
21020 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
21030 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
21040 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
21050 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
21060 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
21070 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
21080 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
21090 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
210a0 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
210b0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
210c0 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
210d0 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
210e0 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
210f0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
21100 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
21110 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
21120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
21130 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
21140 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
21150 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
21160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21170 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
21180 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
21190 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
211a0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
211b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
211c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
211d0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
211e0 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
211f0 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
21200 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
21210 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
21220 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
21230 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
21240 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
21250 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
21260 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
21270 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
21280 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
21290 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
212a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
212b0 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
212c0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
212d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
212e0 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
212f0 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
21300 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
21310 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
21320 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
21330 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
21340 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
21350 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
21360 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
21370 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
21380 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
21390 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
213a0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
213b0 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
213c0 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
213d0 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
213e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
213f0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
21400 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
21410 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
21420 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
21430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21440 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
21450 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
21460 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
21470 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
21480 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
21490 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
214a0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
214b0 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
214c0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
214d0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
214e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
214f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21500 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
21510 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
21520 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
21530 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
21540 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
21550 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
21560 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
21570 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
21580 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
21590 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
215a0 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
215b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
215c0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
215d0 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
215e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
215f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
21600 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21610 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
21620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
21630 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
21640 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
21650 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
21660 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
21670 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
21680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
21690 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
216a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
216b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
216c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
216d0 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
216e0 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
216f0 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
21700 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
21710 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
21720 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
21730 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
21740 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
21750 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
21760 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
21770 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
21780 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21790 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
217a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
217b0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
217c0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
217d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
217e0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
217f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
21800 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21810 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
21820 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
21830 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
21840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21860 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21870 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
21880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21890 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
218a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
218b0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
218c0 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
218d0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
218e0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
218f0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
21900 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
21910 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
21920 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
21930 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
21940 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
21950 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
21960 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
21970 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
21980 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
21990 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
219a0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
219b0 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
219c0 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
219d0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
219e0 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
219f0 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
21a00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
21a10 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
21a20 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
21a30 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
21a40 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
21a50 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
21a60 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
21a70 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
21a80 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
21a90 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
21aa0 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
21ab0 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
21ac0 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
21ad0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
21ae0 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
21af0 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
21b00 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
21b10 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
21b20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
21b30 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
21b40 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
21b50 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
21b60 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
21b70 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
21b80 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
21b90 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
21ba0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
21bb0 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
21bc0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
21bd0 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
21be0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
21bf0 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
21c00 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
21c10 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
21c20 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
21c30 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
21c40 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
21c50 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
21c60 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
21c70 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
21c80 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
21c90 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
21ca0 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
21cb0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
21cc0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
21cd0 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
21ce0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
21cf0 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
21d00 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
21d10 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
21d20 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
21d30 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
21d40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
21d50 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
21d60 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
21d70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
21d80 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
21d90 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
21da0 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
21db0 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
21dc0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
21dd0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
21de0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
21df0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
21e00 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
21e10 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
21e20 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
21e30 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
21e40 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
21e50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21e60 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
21e70 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
21e80 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
21e90 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
21ea0 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
21eb0 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
21ec0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
21ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21ee0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
21ef0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
21f00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
21f10 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
21f20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
21f30 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
21f40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21f60 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
21f70 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
21f80 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
21f90 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
21fa0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21fb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21fd0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21fe0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
21ff0 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
22000 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
22010 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
22020 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
22030 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
22040 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
22050 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
22060 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (p);.    }.    s
22070 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22080 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
22090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
220a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
220b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
220c0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
220d0 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
220e0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
220f0 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
22100 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
22110 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
22120 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
22130 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
22140 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
22150 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
22160 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
22170 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
22180 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
22190 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
221a0 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
221b0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
221c0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
221d0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
221e0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
221f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22200 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
22210 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
22220 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
22230 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
22240 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
22250 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
22260 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
22270 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
22280 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
22290 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
222a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
222b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
222c0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
222d0 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
222e0 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
222f0 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
22300 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
22310 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
22320 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
22330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22340 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
22350 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
22360 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
22370 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
22380 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
22390 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
223a0 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
223b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
223c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
223d0 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
223e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
223f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
22400 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
22410 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
22420 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
22430 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
22440 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
22450 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
22460 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
22470 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
22480 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
22490 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
224a0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
224b0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
224c0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
224d0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
224e0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
224f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
22500 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
22510 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
22520 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
22530 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
22540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22550 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
22560 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
22570 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
22580 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
22590 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
225a0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
225b0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
225c0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
225d0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
225e0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
225f0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
22600 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
22610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22620 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
22630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22640 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
22650 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
22660 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
22670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22680 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
22690 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
226a0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
226b0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
226c0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
226d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
226e0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
226f0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
22700 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
22710 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
22720 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
22730 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
22740 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
22750 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
22760 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
22770 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
22780 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
22790 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
227a0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
227b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
227c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
227d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
227e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
227f0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
22800 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
22810 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
22820 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
22830 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
22840 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
22850 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
22860 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
22870 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
22880 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
22890 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
228a0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
228b0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
228c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
228d0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
228e0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
228f0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
22900 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
22910 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
22920 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
22930 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
22940 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
22950 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
22960 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
22970 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
22980 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
22990 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
229a0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
229b0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
229c0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
229d0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
229e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
229f0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
22a00 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
22a10 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
22a20 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
22a30 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
22a40 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
22a50 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
22a60 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
22a70 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
22a80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
22a90 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
22aa0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
22ab0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
22ac0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
22ad0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
22ae0 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
22af0 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
22b00 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
22b10 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
22b20 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
22b30 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
22b40 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
22b50 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
22b60 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
22b70 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
22b80 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
22b90 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
22ba0 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
22bb0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
22bc0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
22bd0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
22be0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
22bf0 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
22c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
22c10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22c20 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
22c30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
22c40 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
22c50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22c60 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
22c70 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
22c80 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
22c90 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
22ca0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
22cb0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
22cc0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
22cd0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
22ce0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22cf0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
22d00 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
22d10 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
22d20 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22d30 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
22d40 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
22d50 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
22d60 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
22d70 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
22d80 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
22d90 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
22da0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
22db0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
22dc0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
22dd0 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
22de0 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
22df0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22e00 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
22e10 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
22e20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22e30 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
22e40 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
22e50 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
22e60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22e80 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
22e90 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
22ea0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
22eb0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
22ec0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
22ed0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
22ee0 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
22ef0 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
22f00 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
22f10 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
22f20 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
22f30 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
22f40 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
22f50 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
22f60 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
22f70 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
22f80 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
22f90 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
22fa0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
22fb0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
22fc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
22fd0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
22fe0 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
22ff0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
23000 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
23010 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
23020 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
23030 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
23040 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
23050 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
23060 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
23070 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
23080 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
23090 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
230a0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
230b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
230c0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
230d0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
230e0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
230f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23100 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
23110 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23120 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
23130 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23140 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
23150 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
23160 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
23170 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23180 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
23190 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
231a0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
231b0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
231c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
231d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
231e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69  eEnter(p);.    i
231f0 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
23200 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
23210 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
23220 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
23230 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23260 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
23270 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
23280 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
23290 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
232a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
232b0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
232c0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
232d0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
232e0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
232f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
23300 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
23310 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
23320 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
23330 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
23340 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
23350 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
23360 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
23370 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23380 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
23390 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
233a0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
233b0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
233c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
233d0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
233e0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
233f0 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
23400 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
23410 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
23420 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
23430 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
23440 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23450 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23470 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
23480 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
23490 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
234a0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
234b0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
234c0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
234d0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
234e0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
234f0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
23500 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
23510 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
23520 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
23530 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23540 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
23550 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
23560 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
23570 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
23580 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
23590 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
235a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
235b0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
235c0 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
235d0 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
235e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
235f0 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
23600 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
23610 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
23620 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
23630 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
23640 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
23650 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
23660 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
23670 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
23680 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
23690 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
236a0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
236b0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
236c0 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
236d0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
236e0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
236f0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
23700 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
23710 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
23720 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
23730 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
23740 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
23750 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
23760 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
23770 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
23780 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
23790 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
237a0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
237b0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
237c0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
237d0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
237e0 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
237f0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
23800 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
23810 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
23820 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
23830 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
23840 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
23850 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
23860 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
23870 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
23880 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
23890 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
238a0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
238b0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
238c0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
238d0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
238e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
238f0 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
23900 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
23910 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
23920 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
23930 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
23940 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
23950 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
23960 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
23970 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
23980 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
23990 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
239a0 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
239b0 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
239c0 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
239d0 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
239e0 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
239f0 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
23a00 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
23a10 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
23a20 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
23a30 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
23a40 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
23a50 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
23a60 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
23a70 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
23a80 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
23a90 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
23aa0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
23ab0 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
23ac0 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
23ad0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
23ae0 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
23af0 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
23b00 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
23b10 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
23b20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
23b30 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
23b40 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
23b50 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
23b60 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
23b70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
23b80 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
23b90 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
23ba0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
23bb0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
23bc0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
23bd0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
23be0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23bf0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
23c00 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
23c10 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
23c20 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
23c30 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
23c40 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
23c50 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
23c60 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
23c70 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
23c80 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
23c90 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
23ca0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
23cb0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
23cc0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23cf0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
23d00 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
23d30 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
23d40 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
23d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d70 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
23d80 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23d90 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23da0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
23db0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
23dc0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
23dd0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
23de0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
23e10 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
23e20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
23e30 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
23e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
23e50 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
23e60 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
23e70 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e90 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
23ea0 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
23eb0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
23ec0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
23ed0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
23ee0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
23ef0 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
23f00 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
23f10 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23f20 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
23f30 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
23f40 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
23f50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
23f60 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
23f70 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
23f80 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
23f90 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
23fa0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
23fb0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
23fc0 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
23fd0 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
23fe0 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
23ff0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
24000 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
24010 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
24020 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
24030 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
24040 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
24050 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
24060 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
24070 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
24080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24090 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
240a0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
240b0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
240c0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
240d0 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
240e0 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
240f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
24100 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
24110 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
24120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
24130 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
24140 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
24150 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
24160 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
24170 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
24180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24190 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
241a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
241b0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
241c0 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
241d0 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
241e0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
241f0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
24200 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
24210 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24220 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
24230 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
24240 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
24250 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
24260 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
24270 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
24280 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
24290 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
242a0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
242b0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
242c0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
242d0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
242e0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
242f0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
24300 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
24310 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
24320 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
24330 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
24340 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
24350 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
24360 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
24370 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
24380 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
24390 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
243a0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
243b0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
243c0 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
243d0 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
243e0 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
243f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
24400 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
24410 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
24420 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
24430 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
24440 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
24450 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
24460 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
24470 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
24480 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
24490 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
244a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
244b0 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
244c0 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
244d0 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
244e0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
244f0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
24500 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
24510 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
24520 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
24530 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
24540 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
24550 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24560 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
24570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
24580 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24590 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
245d0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
24610 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
24620 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
24660 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
24670 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
24680 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
24690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
246a0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
246b0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
246c0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
246f0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
24700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
24710 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
24720 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
24730 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24750 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24760 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
24770 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
24780 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
24790 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
247a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
247b0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
247c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
247d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
247e0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
247f0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
24800 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
24810 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
24820 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
24830 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
24840 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
24850 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
24860 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
24870 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
24880 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
24890 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
248a0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
248b0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
248c0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
248d0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
248e0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
248f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24900 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
24910 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
24920 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
24930 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
24940 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
24950 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
24960 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
24970 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
24980 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
24990 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
249a0 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
249b0 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
249c0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
249d0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
249e0 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
249f0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
24a00 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
24a10 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
24a20 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
24a30 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
24a40 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
24a50 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
24a60 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
24a70 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
24a80 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
24a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24aa0 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
24ab0 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
24ac0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
24ad0 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52  Cursor, BTCURSOR
24ae0 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b  _FIRST_UNINIT));
24af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
24b00 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
24b10 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
24b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
24b30 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
24b40 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
24b50 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
24b60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24b70 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
24b80 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
24b90 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
24ba0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
24bb0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
24bc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24bd0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
24be0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24bf0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
24c00 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
24c10 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
24c20 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
24c30 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
24c40 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
24c50 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
24c60 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
24c70 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
24c80 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
24c90 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
24ca0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
24cb0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
24cc0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
24cd0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
24ce0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24d00 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
24d10 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
24d20 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
24d30 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ) );.    }.    b
24d40 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
24d50 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
24d60 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
24d70 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
24d80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24d90 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
24da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24db0 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
24dc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24dd0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
24de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
24df0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24e00 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
24e10 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
24e20 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
24e30 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
24e40 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
24e50 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
24e60 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
24e70 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
24e80 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
24e90 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
24ea0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
24eb0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
24ec0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
24ed0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
24ee0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
24ef0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
24f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
24f10 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
24f20 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
24f30 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
24f40 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71  c int cellInfoEq
24f50 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c  ual(CellInfo *a,
24f60 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20   CellInfo *b){. 
24f70 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d     if( a->nKey!=
24f80 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  b->nKey ) return
24f90 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70   0;.    if( a->p
24fa0 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79  Payload!=b->pPay
24fb0 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
24fc0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79  .    if( a->nPay
24fd0 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61  load!=b->nPayloa
24fe0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
24ff0 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21    if( a->nLocal!
25000 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74  =b->nLocal ) ret
25010 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25020 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a  ->nSize!=b->nSiz
25030 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
25040 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25050 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
25060 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
25070 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25080 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
25090 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
250a0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
250b0 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
250c0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
250d0 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  age, pCur->ix, &
250e0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
250f0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
25100 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26   cellInfoEqual(&
25110 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
25120 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  o) );.  }.#else.
25130 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
25140 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
25150 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
25160 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
25170 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
25180 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
25190 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
251a0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ze==0 ){.    pCu
251b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
251c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
251d0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
251e0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43  l(pCur->pPage,pC
251f0 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e  ur->ix,&pCur->in
25200 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
25210 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
25220 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
25230 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
25240 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
25250 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
25260 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
25270 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
25280 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25290 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
252a0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
252b0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
252c0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
252d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
252e0 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
252f0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
25300 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
25310 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
25320 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
25330 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
25340 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
25350 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25360 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
25370 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25380 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
25390 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
253a0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
253b0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
253c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
253d0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
253e0 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  NN(BtCursor *pCu
253f0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  r){.  assert( pC
25400 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ur!=0 );.  retur
25410 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  n pCur->eState==
25420 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
25430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25440 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
25450 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72  nteger key or "r
25460 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c  owid" for a tabl
25470 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73  e btree..** This
25480 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
25490 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72   valid for a cur
254a0 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
254b0 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f  ting into a.** o
254c0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74  rdinary table bt
254d0 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ree.  If the cur
254e0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  sor points to an
254f0 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a   index btree or.
25500 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74  ** is invalid, t
25510 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69  he result of thi
25520 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64  s routine is und
25530 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73  efined..*/.i64 s
25540 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
25550 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  erKey(BtCursor *
25560 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
25570 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25580 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25590 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
255a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
255b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
255c0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
255d0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
255e0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
255f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d  ur->info.nKey;.}
25600 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25610 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
25620 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74  L_FUNC./*.** Ret
25630 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69  urn the offset i
25640 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
25650 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74   file for the st
25660 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  art of the.** pa
25670 79 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74  yload to which t
25680 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
25690 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71  nting..*/.i64 sq
256a0 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74  lite3BtreeOffset
256b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
256c0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
256d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
256e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
256f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25700 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25710 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
25720 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34  );.  return (i64
25730 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  )pCur->pBt->page
25740 53 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d  Size*((i64)pCur-
25750 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31  >pPage->pgno - 1
25760 29 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36  ) +.         (i6
25770 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  4)(pCur->info.pP
25780 61 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70  ayload - pCur->p
25790 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a  Page->aData);.}.
257a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
257b0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
257c0 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a  QL_FUNC */../*.*
257d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
257e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
257f0 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
25800 65 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20  entry that pCur 
25810 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
25820 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f  pointing to.  Fo
25830 72 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20  r table btrees, 
25840 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
25850 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61   amount.** of da
25860 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62  ta.  For index b
25870 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
25880 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20   be the size of 
25890 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
258a0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
258b0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
258c0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
258d0 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
258e0 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
258f0 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
25900 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
25910 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
25920 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
25930 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
25940 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
25950 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a  URSOR_VALID..*/.
25960 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
25970 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75  PayloadSize(BtCu
25980 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
25990 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
259a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
259b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
259c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
259d0 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
259e0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
259f0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
25a00 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f  o.nPayload;.}../
25a10 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
25a20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
25a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25a40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
25a50 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
25a60 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
25a70 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
25a80 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
25a90 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
25aa0 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
25ab0 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
25ac0 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
25ad0 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
25ae0 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
25af0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
25b00 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
25b10 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
25b20 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
25b30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
25b40 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
25b50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25b60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
25b70 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
25b80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
25b90 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
25ba0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
25bb0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
25bc0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
25bd0 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
25be0 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
25bf0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
25c00 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
25c10 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
25c20 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
25c30 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
25c40 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
25c50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
25c60 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
25c70 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
25c80 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
25c90 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
25ca0 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
25cb0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
25cc0 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
25cd0 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
25ce0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
25cf0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
25d00 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
25d10 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
25d20 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
25d30 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
25d40 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
25d50 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
25d60 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
25d70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
25d80 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
25d90 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
25da0 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
25db0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
25dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
25dd0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
25de0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e00 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
25e10 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
25e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25e30 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
25e40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
25e50 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
25e60 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
25e70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
25e80 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
25e90 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
25ea0 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ec0 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
25ed0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
25ee0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
25ef0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
25f00 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
25f10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25f20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
25f30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
25f40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
25f50 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
25f60 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
25f70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25f80 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
25f90 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
25fa0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
25fb0 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
25fc0 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
25fd0 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
25fe0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
25ff0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
26000 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
26010 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
26020 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
26030 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
26040 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
26050 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
26060 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
26070 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
26080 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
26090 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
260a0 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
260b0 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
260c0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
260d0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
260e0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
260f0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
26100 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
26110 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
26120 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
26130 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
26140 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
26150 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
26160 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
26170 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
26180 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
26190 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
261a0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
261b0 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
261c0 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
261d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
261e0 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
261f0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
26200 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
26210 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
26220 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
26230 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
26240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26250 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
26260 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
26270 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
26280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26290 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
262a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
262b0 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
262c0 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
262d0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
262e0 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
262f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
26300 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
26310 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
26330 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
26340 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
26350 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
26360 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
26370 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
26380 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
26390 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
263a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
263b0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
263c0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
263d0 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
263e0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
263f0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
26400 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
26410 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
26420 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
26430 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
26440 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
26450 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
26460 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
26470 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
26480 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
26490 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
264a0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
264b0 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
264c0 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
264d0 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
264e0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
264f0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
26500 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26510 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
26520 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
26530 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
26540 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
26550 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
26560 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
26570 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
26580 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
26590 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
265a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
265b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
265c0 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
265d0 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
265e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
265f0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
26600 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26620 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
26630 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
26640 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
26660 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
26670 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
26680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
26690 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
266a0 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
266b0 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
266c0 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
266d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
266e0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
266f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
26700 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
26710 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
26720 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
26730 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
26740 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
26750 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26760 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
26770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
26790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
267a0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
267b0 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
267c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
267d0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
267e0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
267f0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
26800 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
26810 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
26820 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26850 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
26860 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
26870 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
26880 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
26890 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
268a0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
268b0 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
268c0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
268d0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
268e0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
268f0 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
26900 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
26910 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
26920 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
26930 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
26940 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
26950 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
26960 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   cache..**.** A 
26970 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
26980 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
26990 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
269a0 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
269b0 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
269c0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
269d0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
269e0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
269f0 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
26a00 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
26a10 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
26a20 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
26a30 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
26a40 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
26a50 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
26a60 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
26a70 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
26a80 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
26a90 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66   pages.** this f
26aa0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f  unction may allo
26ab0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
26ac0 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  nd lazily popula
26ad0 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  te.** the overfl
26ae0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26af0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
26b00 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
26b10 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
26b20 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
26b30 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
26b40 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
26b50 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
26b60 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
26b70 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
26b80 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26b90 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
26ba0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74  located, it must
26bb0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
26bc0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
26bd0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
26be0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
26bf0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
26c00 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
26c10 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
26c20 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
26c30 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
26c40 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
26c50 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
26c60 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
26c70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
26c80 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
26c90 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
26ca0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
26cb0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
26cc0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
26cd0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
26ce0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
26cf0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
26d00 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
26d10 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
26d20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
26d30 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
26d40 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
26d50 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
26d60 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
26d70 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
26d80 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
26d90 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
26da0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
26db0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
26dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
26dd0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
26de0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
26df0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
26e00 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
26e10 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
26e20 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
26e30 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
26e40 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
26e50 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
26e60 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
26e70 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
26e80 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
26e90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
26ea0 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
26eb0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
26ec0 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20  r->pPage;       
26ed0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
26ee0 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
26ef0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
26f00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
26f10 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
26f20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
26f30 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
26f40 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
26f50 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
26f60 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
26f70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
26f80 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20  const pBufStart 
26f90 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53  = pBuf;     /* S
26fa0 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c  tart of original
26fb0 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23   out buffer */.#
26fc0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
26fd0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
26fe0 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f  rt( eOp==0 || eO
26ff0 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
27000 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27010 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27020 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27030 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
27040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
27050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27060 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
27070 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
27080 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
27090 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20  info.pPayload;. 
270a0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
270b0 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
270c0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
270d0 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
270e0 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
270f0 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
27100 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
27110 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
27120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
27130 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27140 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
27150 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
27160 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
27170 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
27180 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
27190 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
271a0 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
271b0 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
271c0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
271d0 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
271e0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
271f0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
27200 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
27210 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
27220 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
27230 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
27240 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
27250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27260 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
27270 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
27280 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
27290 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
272a0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
272b0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
272c0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
272d0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
272e0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
272f0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
27300 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
27310 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
27320 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
27330 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
27340 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
27350 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
27360 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
27370 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
27380 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
27390 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
273a0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
273b0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
273c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
273d0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
273e0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
273f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27400 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
27410 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
27420 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
27430 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
27440 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
27450 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
27460 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
27470 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
27480 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
27490 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
274a0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
274b0 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
274c0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
274d0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
274e0 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
274f0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
27500 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
27510 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
27520 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
27530 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
27540 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
27550 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
27560 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
27570 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
27580 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
27590 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
275a0 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
275b0 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
275c0 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
275d0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
275e0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
275f0 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
27600 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
27610 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
27620 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
27630 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
27640 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
27650 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
27660 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
27670 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
27680 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
27690 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
276a0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  e;.      if( pCu
276b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a  r->aOverflow==0.
276c0 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a         || nOvfl*
276d0 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f  (int)sizeof(Pgno
276e0 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ) > sqlite3Mallo
276f0 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65  cSize(pCur->aOve
27700 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a  rflow).      ){.
27710 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
27720 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
27730 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
27740 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
27750 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
27760 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
27770 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
27780 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
27790 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
277a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
277b0 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
277c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
277d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
277e0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
277f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
27800 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
27810 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
27820 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
27830 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
27840 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
27850 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
27860 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
27870 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27880 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
27890 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
278a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
278b0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
278c0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
278d0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
278e0 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
278f0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
27900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27910 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
27920 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
27930 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
27940 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
27950 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
27960 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
27970 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
27980 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
27990 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
279a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
279b0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
279c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
279d0 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
279e0 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
279f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
27a00 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
27a10 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
27a20 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
27a30 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
27a40 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27a50 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
27a60 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
27a70 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
27a80 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
27a90 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
27aa0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
27ab0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
27ac0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
27ad0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
27ae0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
27af0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27b00 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
27b10 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
27b20 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
27b30 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
27b40 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
27b50 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
27b60 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27b70 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
27b80 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
27b90 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
27ba0 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
27bb0 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
27bc0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
27bd0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
27be0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
27bf0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
27c00 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
27c10 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
27c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27c30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
27c40 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
27c50 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
27c60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27c70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
27c80 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
27c90 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27ca0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
27cb0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
27cc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
27cd0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
27ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27cf0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
27d00 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
27d10 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
27d20 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
27d30 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
27d40 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
27d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27d60 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
27d70 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
27d80 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
27d90 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
27da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
27db0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
27dc0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
27dd0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
27de0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
27df0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
27e00 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27e10 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
27e20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27e30 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  d;      /* File 
27e40 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f  from which to do
27e50 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77   direct overflow
27e60 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
27e70 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
27e80 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
27e90 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
27ea0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
27eb0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
27ec0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
27ed0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
27ee0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27ef0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
27f00 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
27f10 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
27f20 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
27f30 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
27f40 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
27f50 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
27f60 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
27f70 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
27f80 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
27f90 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
27fa0 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
27fb0 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69 73  **   3) there is
27fc0 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
27fd0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
27fe0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
27ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
28000 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
28010 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
28020 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
28030 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   in the WAL file
28040 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
28050 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
28060 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
28070 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
28080 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
28090 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
280a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
280b0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
280c0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
280d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
280e0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
280f0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
28100 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
28110 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
28120 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
28130 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
28140 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
28150 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
28160 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
28170 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
28180 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
28190 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
281c0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
281d0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
28210 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
28220 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
28230 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28250 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
28260 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
28270 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
28280 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
28290 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20  hods     /* (4) 
282a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  */.         && 0
282b0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73  ==sqlite3PagerUs
282c0 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  eWal(pBt->pPager
282d0 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20 20  , nextPage)     
282e0 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
282f0 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
28300 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
28330 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
28340 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
28350 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
28360 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
28370 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
28380 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
28390 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
283c0 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
283d0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
283e0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
283f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28400 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
28410 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
28420 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
28430 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
28440 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
28450 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
28460 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
28470 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
28480 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
28490 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
284a0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
284b0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
284c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
284d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
284e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
284f0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
28500 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
28510 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
28520 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
28530 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
28540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28560 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
28570 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
28580 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
28590 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
285a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
285b0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
285c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
285d0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
285e0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
285f0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
28600 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28610 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
28620 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
28630 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
28640 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
28650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28660 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
28670 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
28680 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
28690 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
286a0 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
286b0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
286c0 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
286d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
286e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
286f0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
28700 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
28710 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
28720 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
28730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
28740 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
28750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28760 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
28770 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  of the payload f
28780 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68  or the row at wh
28790 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20  ich that cursor 
287a0 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c  pCur is currentl
287b0 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20  y.** pointing.  
287c0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
287d0 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20   be transferred 
287e0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
287f0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
28800 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
28810 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e  ..**.** pCur can
28820 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
28830 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f  either a table o
28840 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  r an index b-tre
28850 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e  e..** If pointin
28860 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72  g to a table btr
28870 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ee, then the con
28880 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20  tent section is 
28890 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75  read.  If.** pCu
288a0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
288b0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
288c0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65   then the key se
288d0 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a  ction is read..*
288e0 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33  *.** For sqlite3
288f0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20  BtreePayload(), 
28900 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
28910 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
28920 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20   is pointing.** 
28930 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69  to a valid row i
28940 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f  n the table.  Fo
28950 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
28960 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20  yloadChecked(), 
28970 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69  the.** cursor mi
28980 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f  ght be invalid o
28990 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  r might need to 
289a0 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  be restored befo
289b0 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a  re being read..*
289c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
289d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
289e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
289f0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
28a00 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
28a10 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28a20 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
28a30 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
28a40 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
28a50 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
28a60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
28a70 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20  ayload(BtCursor 
28a80 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
28a90 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
28aa0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
28ab0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28ac0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28ad0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28ae0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28af0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
28b00 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
28b10 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
28b20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28b30 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ix<pCur->pPage->
28b40 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
28b50 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28b60 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
28b70 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
28b80 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
28b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
28ba0 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  nt of sqlite3Btr
28bb0 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b  eePayload() work
28bc0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75  s even if the cu
28bd0 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  rsor has not.** 
28be0 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41  in the CURSOR_VA
28bf0 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69  LID state.  It i
28c00 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
28c10 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
28c20 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66  read().** interf
28c30 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ace..*/.#ifndef 
28c40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28c50 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49  BLOB.static SQLI
28c60 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
28c70 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
28c80 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
28c90 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66   *pCur,.  u32 of
28ca0 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c  fset,.  u32 amt,
28cb0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b  .  void *pBuf.){
28cc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20  .  int rc;.  if 
28cd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28ce0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
28cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28d00 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20  ITE_ABORT;.  }. 
28d10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28d20 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28d30 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
28d40 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
28d50 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
28d60 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a  return rc ? rc :
28d70 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
28d80 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
28d90 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e  , pBuf, 0);.}.in
28da0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
28db0 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43  yloadChecked(BtC
28dc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28dd0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
28de0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
28df0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28e00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28e10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  ){.    assert( c
28e20 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28e30 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72  d(pCur) );.    r
28e40 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
28e50 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
28e60 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
28e70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
28e80 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
28e90 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20  adChecked(pCur, 
28ea0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
28eb0 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
28ec0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28ed0 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
28ee0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
28ef0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
28f00 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
28f10 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
28f20 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
28f30 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
28f40 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
28f50 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
28f60 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
28f70 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
28f80 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
28f90 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
28fa0 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
28fb0 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
28fc0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
28fd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
28fe0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
28ff0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
29000 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
29010 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
29020 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
29030 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
29040 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
29050 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
29060 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
29070 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
29080 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
29090 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
290a0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
290b0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
290c0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
290d0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
290e0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
290f0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
29100 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
29110 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
29120 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
29130 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
29140 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
29150 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
29160 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
29170 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
29180 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
29190 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
291a0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
291b0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
291c0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
291d0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
291e0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
291f0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
29200 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
29210 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
29220 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
29230 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
29240 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
29250 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
29260 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
29270 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
29280 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
29290 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
292a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
292b0 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
292c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
292d0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
292e0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
292f0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
29300 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
29310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
29320 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
29330 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
29340 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
29350 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  nt amt;.  assert
29360 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
29370 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
29380 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61  Cur->pPage);.  a
29390 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
293a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
293b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
293c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
293d0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
293e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
293f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29400 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29420 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
29430 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
29440 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29450 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
29460 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29470 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
29480 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  >pPage->aData ||
29490 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
294a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
294b0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
294c0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
294d0 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
294e0 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  ;.  amt = pCur->
294f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69  info.nLocal;.  i
29500 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75  f( amt>(int)(pCu
29510 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
29520 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
29530 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20  pPayload) ){.   
29540 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f   /* There is too
29550 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e   little space on
29560 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68   the page for th
29570 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e  e expected amoun
29580 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61  t.    ** of loca
29590 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62  l content. Datab
295a0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
295b0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  upt. */.    asse
295c0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  rt( CORRUPT_DB )
295d0 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28  ;.    amt = MAX(
295e0 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70  0, (int)(pCur->p
295f0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d  Page->aDataEnd -
29600 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29610 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  load));.  }.  *p
29620 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a  Amt = (u32)amt;.
29630 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
29640 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
29650 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
29660 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
29670 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
29680 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
29690 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
296a0 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
296b0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
296c0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
296d0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
296e0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
296f0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
29700 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
29710 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
29720 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
29730 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
29740 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
29750 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
29760 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
29770 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
29780 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
29790 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
297a0 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
297b0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
297c0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
297d0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
297e0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
297f0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
29800 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
29810 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
29820 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
29830 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
29840 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
29850 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
29860 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
29870 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
29880 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
29890 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
298a0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
298b0 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
298c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
298d0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
298e0 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
298f0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
29900 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
29910 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
29920 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
29930 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
29940 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29950 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
29960 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
29970 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
29980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29990 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
299a0 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
299b0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
299c0 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
299d0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
299e0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
299f0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
29a00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
29a10 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
29a20 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
29a30 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
29a40 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
29a50 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
29a60 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
29a70 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
29a80 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
29a90 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
29aa0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
29ab0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
29ac0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ad0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29ae0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29af0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29b00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29b10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29b20 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
29b30 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
29b40 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29b50 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
29b60 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
29b70 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
29b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29ba0 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
29bb0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29bc0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29bd0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
29be0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
29bf0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
29c00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29c10 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
29c20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29c30 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
29c40 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
29c50 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
29c60 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72  iPage++;.  retur
29c70 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
29c80 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
29c90 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
29ca0 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
29cb0 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
29cc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29cd0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
29ce0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
29cf0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
29d00 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
29d10 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
29d20 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
29d30 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
29d40 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
29d50 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
29d60 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
29d70 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
29d80 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
29d90 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
29da0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
29db0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
29dc0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
29dd0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29de0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
29df0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
29e00 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29e10 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
29e20 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
29e30 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
29e40 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
29e50 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
29e60 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
29e70 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
29e80 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
29eb0 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
29ec0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
29ed0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
29ee0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
29ef0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
29f00 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29f10 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29f20 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29f30 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
29f40 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
29f50 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29f60 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
29f70 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
29f80 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
29f90 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
29fa0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29fb0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
29fc0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29fd0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
29fe0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
29ff0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2a000 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2a010 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2a020 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2a030 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2a040 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2a050 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2a060 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2a070 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2a080 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2a090 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2a0a0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2a0b0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2a0c0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2a0d0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2a0e0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2a0f0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2a100 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2a110 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a120 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a140 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a150 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2a160 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2a170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a180 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2a190 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2a1a0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2a1b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2a1c0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2a1d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a1e0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2a1f0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2a200 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2a210 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a220 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2a230 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2a240 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2a250 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a260 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2a270 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2a280 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2a290 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2a2a0 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2a2b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a2c0 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2a2d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2a2e0 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2a2f0 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2a300 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2a310 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2a320 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2a330 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a340 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2a350 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2a360 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2a370 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2a380 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2a390 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2a3a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a3b0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2a3c0 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2a3d0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2a3e0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2a3f0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2a400 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2a410 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2a420 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2a430 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2a440 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2a450 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2a460 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2a470 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2a480 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2a490 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2a4a0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2a4b0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2a4c0 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2a4d0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2a4e0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2a4f0 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2a500 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2a510 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2a520 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2a530 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2a540 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2a550 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2a560 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2a570 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2a580 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2a590 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2a5a0 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2a5b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2a5c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a5d0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2a5e0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2a5f0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2a600 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2a610 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2a620 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2a630 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2a640 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2a650 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2a660 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2a670 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2a680 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2a690 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2a6a0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2a6b0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2a6c0 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2a6d0 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2a6e0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2a6f0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2a700 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2a710 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2a720 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2a730 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2a740 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2a750 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2a760 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2a770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2a780 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2a790 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2a7a0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2a7b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a7c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2a7d0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2a7e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a7f0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2a800 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2a810 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2a820 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2a830 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2a840 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2a850 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2a860 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2a870 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2a880 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a890 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2a8a0 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2a8b0 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2a8c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a8d0 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2a8e0 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2a8f0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2a900 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2a910 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2a920 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2a930 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2a940 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2a950 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2a960 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2a970 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2a980 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a990 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2a9a0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2a9b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a9c0 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2a9d0 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2a9e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2a9f0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2aa00 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2aa10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2aa20 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2aa30 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2aa40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2aa50 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2aa60 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2aa70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2aa80 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2aa90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2aaa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2aab0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2aac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2aad0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2aae0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2aaf0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2ab00 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2ab10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2ab20 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2ab30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2ab40 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2ab50 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2ab60 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2ab70 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2ab80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2ab90 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2aba0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2abb0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2abc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2abd0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2abe0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2abf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2ac00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
2ac10 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
2ac20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
2ac30 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  y = pCur->pPage-
2ac40 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2ac50 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2ac60 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ge;.  assert( pR
2ac70 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2ac80 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2ac90 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2aca0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2acb0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2acc0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2acd0 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2ace0 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2acf0 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2ad00 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2ad10 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2ad20 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2ad30 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2ad40 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2ad50 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2ad60 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2ad70 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2ad80 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2ad90 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2ada0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2adb0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2adc0 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2add0 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2ade0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2adf0 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2ae00 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2ae10 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2ae20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2ae30 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2ae40 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2ae50 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2ae60 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2ae70 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2ae80 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2ae90 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2aea0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2aeb0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2aec0 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2aed0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2aee0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2aef0 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2af00 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2af10 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2af20 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2af30 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2af40 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2af50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2af60 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67  _PAGE(pCur->pPag
2af70 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  e);.  }..skip_in
2af80 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
2af90 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
2afa0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2afb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2afc0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2afd0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2afe0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2aff0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2b000 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52  >pPage;.  if( pR
2b010 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
2b020 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2b030 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2b040 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
2b050 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
2b060 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
2b070 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
2b080 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
2b090 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b0a0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
2b0b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
2b0c0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2b0d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2b0e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b0f0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b100 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2b110 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
2b120 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2b130 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b140 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b150 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b160 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65  _EMPTY;.  }.  re
2b170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b180 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2b190 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
2b1a0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
2b1b0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2b1c0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
2b1d0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2b1e0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
2b1f0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
2b200 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
2b210 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
2b220 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
2b230 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2b240 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2b250 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
2b260 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2b270 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2b280 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2b290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2b2a0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2b2b0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b2c0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b2e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2b2f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2b300 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b310 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
2b320 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2b330 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b340 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2b350 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2b360 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2b370 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2b380 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2b390 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2b3a0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2b3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b3c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2b3d0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2b3e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2b3f0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2b400 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2b410 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2b420 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2b430 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2b440 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2b450 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2b460 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2b470 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2b480 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2b490 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2b4a0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2b4b0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2b4c0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2b4d0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2b4e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2b4f0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2b500 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2b510 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2b520 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2b530 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2b540 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2b550 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2b560 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2b570 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2b580 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2b590 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2b5a0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2b5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2b5c0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2b5d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b5e0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2b5f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b600 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b610 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2b620 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2b630 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
2b640 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2b650 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b660 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2b670 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2b680 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70      pCur->ix = p
2b690 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2b6a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2b6b0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2b6c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2b6d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2b6e0 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2b6f0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2b700 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2b710 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2b720 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2b730 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2b740 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2b750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b760 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2b770 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2b780 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2b790 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2b7a0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2b7b0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2b7c0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2b7d0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2b7e0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2b7f0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2b800 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2b810 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2b820 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b830 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2b840 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2b850 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2b860 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b870 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2b890 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b8a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2b8b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
2b8c0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2b8d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2b8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b8f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b900 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2b910 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2b920 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2b930 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2b940 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2b950 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2b960 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b970 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2b980 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2b990 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2b9a0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2b9b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b9c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b9d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2b9e0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
2b9f0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2ba00 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2ba10 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2ba20 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2ba30 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2ba40 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2ba50 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2ba60 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2ba70 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2ba80 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2ba90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
2baa0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2bab0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2bac0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
2bad0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2bae0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2baf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bb00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2bb10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2bb20 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2bb30 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
2bb40 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
2bb50 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
2bb60 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
2bb70 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
2bb80 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2bb90 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
2bba0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2bbb0 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
2bbc0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2bbd0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
2bbe0 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
2bbf0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
2bc00 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
2bc10 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
2bc20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2bc30 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
2bc40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
2bc50 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2bc60 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
2bc70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2bc80 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
2bc90 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
2bca0 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
2bcb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2bcc0 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d   pCur->ix==pCur-
2bcd0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20  >pPage->nCell-1 
2bce0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2bcf0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
2bd00 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2bd10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd20 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2bd30 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2bd40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bd50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2bd60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2bd70 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2bd80 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2bd90 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2bda0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2bdb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2bdd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2bde0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2bdf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
2be00 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2be10 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
2be20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2be30 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2be40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2be50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2be60 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2be70 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2be80 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2be90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bea0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2beb0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2bec0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2bed0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2bee0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2bef0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2bf00 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2bf10 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2bf20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2bf30 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2bf40 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2bf50 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2bf60 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2bf70 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2bf80 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2bf90 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2bfa0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2bfb0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2bfc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2bfd0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2bfe0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2bff0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2c000 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2c010 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2c020 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2c030 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2c040 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2c050 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2c060 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2c070 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2c080 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2c090 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2c0a0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2c0b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2c0c0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2c0d0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2c0e0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2c0f0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2c100 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2c110 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2c120 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2c130 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2c140 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2c150 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2c160 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2c170 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2c180 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2c190 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2c1a0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2c1c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2c1d0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2c1e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2c1f0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2c200 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2c210 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2c220 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2c230 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2c240 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2c250 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2c260 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2c270 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2c280 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c290 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2c2a0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2c2b0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2c2c0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2c2d0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2c2e0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2c2f0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2c300 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2c310 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2c320 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2c330 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2c340 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2c350 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2c360 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2c370 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2c380 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2c390 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2c3a0 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2c3b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c3c0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2c3d0 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2c3e0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2c3f0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2c400 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2c410 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2c420 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2c430 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2c440 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2c450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c460 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2c470 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2c480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2c490 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2c4a0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2c4b0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2c4c0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2c4d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2c4e0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2c4f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2c500 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2c510 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2c520 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2c530 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2c540 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c550 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2c560 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2c570 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2c580 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2c590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2c5a0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2c5b0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2c5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c5d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c5e0 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2c5f0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2c600 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2c610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2c620 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2c630 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2c640 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2c650 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2c660 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2c670 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2c680 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2c690 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2c6a0 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2c6b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2c6c0 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2c6d0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2c6e0 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2c6f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2c700 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2c710 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2c720 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2c730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c740 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2c750 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2c760 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
2c770 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c780 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2c790 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2c7a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72   = -1;.        r
2c7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2c7d0 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2c7e0 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f  ed key is one mo
2c7f0 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  re than the prev
2c800 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20  ious key, then. 
2c810 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67       ** try to g
2c820 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73  et there using s
2c830 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c840 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  ) rather than a 
2c850 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69  full.      ** bi
2c860 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68  nary search.  Th
2c870 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2c880 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65  ation only.  The
2c890 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a   correct answer.
2c8a0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2c8b0 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  l obtained witho
2c8c0 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e  ut this case, on
2c8d0 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ly a little more
2c8e0 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20   slowely */.    
2c8f0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2c900 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20  .nKey+1==intKey 
2c910 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65  && !pCur->skipNe
2c920 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  xt ){.        *p
2c930 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2c950 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2c960 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2c970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c980 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2c990 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2c9a0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2c9b0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2c9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c9f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ca00 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2ca10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2ca20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ca30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ca40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ca50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ca60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2ca70 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2ca80 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ca90 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2caa0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2cab0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2cac0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2cad0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2cae0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2caf0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2cb00 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2cb10 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2cb20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2cb30 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2cb40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2cb50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2cb60 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2cb70 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2cb80 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2cb90 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2cba0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
2cbb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2cbc0 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Y ){.      asser
2cbd0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2cbe0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2cbf0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2cc00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
2cc10 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2cc20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2cc30 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2cc40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2cc50 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
2cc60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2cc70 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2cc80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2cc90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2cca0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2ccb0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2ccc0 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65  ll > 0 );.  asse
2ccd0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2cce0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2ccf0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2cd00 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2cd10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cd20 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2cd30 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2cd40 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2cd50 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2cd60 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2cd70 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2cd80 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2cd90 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2cdc0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2cdd0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2cde0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2cdf0 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2ce00 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2ce10 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2ce20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2ce30 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2ce40 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2ce50 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2ce60 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2ce70 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2ce80 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2ce90 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2cea0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2ceb0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2cec0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2ced0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2cee0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2cef0 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2cf00 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2cf10 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2cf20 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2cf30 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2cf40 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2cf50 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2cf60 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2cf70 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2cf80 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2cf90 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2cfa0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2cfb0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2cfc0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2cfd0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2cfe0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2cff0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2d000 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2d010 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2d020 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2d030 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2d040 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2d050 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2d060 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2d070 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2d080 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2d090 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2d0a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2d0b0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2d0c0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2d0d0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2d0e0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2d0f0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2d100 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2d110 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2d120 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d130 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2d140 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2d150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2d160 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2d170 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  aEnd ){.        
2d180 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d190 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2d1a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2d1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d1c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d1d0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
2d1e0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
2d1f0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2d200 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
2d210 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2d220 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2d230 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2d240 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
2d250 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2d260 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
2d270 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
2d280 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2d290 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
2d2a0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2d2b0 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
2d2c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d2d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2d2e0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
2d2f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
2d300 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2d310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d320 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d330 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
2d340 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
2d350 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
2d360 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
2d370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d380 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2d390 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
2d3a0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20  alidNKey;.      
2d3b0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2d3c0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
2d3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2d3e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d3f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2d400 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2d430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2d450 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2d460 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2d470 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2d480 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
2d490 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2d4a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
2d4b0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
2d4c0 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65   nCell;  /* Size
2d4d0 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65   of the pCell ce
2d4e0 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ll in bytes */. 
2d4f0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2d500 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2d510 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20  Page, idx);..   
2d520 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
2d530 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
2d540 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
2d550 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
2d560 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
2d570 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
2d580 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
2d590 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
2d5a0 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
2d5b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2d5c0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
2d5d0 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
2d5e0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
2d5f0 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
2d600 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
2d610 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
2d620 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
2d630 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
2d640 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
2d650 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
2d660 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
2d670 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
2d680 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
2d690 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
2d6a0 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
2d6b0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
2d6c0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
2d6d0 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
2d6e0 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
2d6f0 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
2d700 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2d710 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
2d720 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
2d730 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
2d740 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
2d750 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2d760 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
2d770 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
2d780 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
2d790 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
2d7a0 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
2d7b0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
2d7c0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2d7d0 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
2d7e0 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
2d7f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2d800 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2d810 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
2d820 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2d830 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2d840 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2d850 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
2d860 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2d870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
2d880 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
2d890 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
2d8a0 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
2d8b0 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
2d8c0 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
2d8d0 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
2d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2d8f0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2d900 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
2d910 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2d920 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
2d930 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
2d940 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
2d950 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2d960 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d970 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2d980 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
2d990 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2d9a0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2d9b0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2d9c0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
2d9d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2d9e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2d9f0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
2da00 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
2da10 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
2da20 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
2da30 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
2da40 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
2da50 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
2da60 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
2da70 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
2da80 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
2da90 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
2daa0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
2dab0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
2dac0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
2dad0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
2dae0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
2daf0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20  n be called. .  
2db00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2db10 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72       ** If the r
2db20 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
2db30 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d  , the xRecordCom
2db40 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79  pare routine may
2db50 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20   read.          
2db60 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72  ** up to two var
2db70 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e  ints past the en
2db80 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e  d of the buffer.
2db90 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20   An extra 18 .  
2dba0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2dbb0 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61   of padding is a
2dbc0 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
2dbd0 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2dbe0 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  r in.          *
2dbf0 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70  * case this happ
2dc00 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ens.  */.       
2dc10 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
2dc20 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
2dc30 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
2dc40 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
2dc50 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
2dc60 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2dc70 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
2dc80 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
2dc90 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
2dca0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
2dcb0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
2dcc0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Key;.          t
2dcd0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30  estcase( nCell<0
2dce0 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   );   /* True if
2dcf0 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33   key size is 2^3
2dd00 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20  2 or more */.   
2dd10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dd20 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a   nCell==0 );  /*
2dd30 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2dd40 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2dd50 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  00 */.          
2dd60 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2dd70 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =1 );  /* Invali
2dd80 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2dd90 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20  0 0x80 0x01 */. 
2dda0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2ddb0 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20  e( nCell==2 );  
2ddc0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c  /* Minimum legal
2ddd0 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20   index key size 
2dde0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ddf0 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20   nCell<2 ){.    
2de00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2de10 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2de20 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2de30 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2de40 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2de50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2de60 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2de70 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2de80 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2de90 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2dea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2deb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2dec0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2ded0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2dee0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2def0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2df00 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2df10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2df20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2df30 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2df40 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2df50 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
2df60 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2df70 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
2df80 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20  lidOvfl;.       
2df90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2dfa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dfb0 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2dfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dfd0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2dfe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dff0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2e000 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2e010 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2e020 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2e030 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2e040 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2e050 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e060 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2e070 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2e080 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2e090 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2e0a0 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2e0b0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2e0c0 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2e0d0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2e0e0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2e0f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2e100 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2e110 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2e120 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2e130 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2e140 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2e150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2e170 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2e180 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2e190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e1a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2e1b0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2e1c0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2e1d0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2e1e0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2e1f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2e200 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2e210 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2e220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2e230 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2e240 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2e250 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2e260 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2e270 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2e280 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2e290 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2e2a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2e2b0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2e2c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2e2d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2e2e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e2f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2e300 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2e310 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2e320 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2e330 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2e340 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
2e350 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2e360 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2e370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e380 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2e390 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e3a0 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2e3b0 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2e3c0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2e3d0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2e3e0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2e3f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2e400 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2e410 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e420 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2e430 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2e440 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2e450 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2e460 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2e470 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2e480 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2e490 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2e4a0 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2e4b0 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2e4c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
2e4d0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2e4e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2e4f0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2e500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2e510 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2e520 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2e530 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2e540 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2e550 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2e560 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2e570 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2e580 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2e590 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2e5a0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2e5b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2e5c0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2e5d0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2e5e0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2e5f0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2e600 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2e610 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2e620 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2e630 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2e640 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2e650 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2e660 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2e670 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2e680 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2e690 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2e6a0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2e6b0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2e6c0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2e6d0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2e6e0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2e6f0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2e700 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2e710 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2e720 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2e730 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2e740 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
2e750 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68   estimate for th
2e760 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2e770 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2e780 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f  at pCur is.** po
2e790 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75  inting to.  Retu
2e7a0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2e7b0 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d  mber if no estim
2e7c0 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ate is currently
2e7d0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a   .** available..
2e7e0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
2e7f0 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42  reeRowCountEst(B
2e800 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e810 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b    i64 n;.  u8 i;
2e820 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e830 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e840 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e850 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2e860 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2e870 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2e880 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79  ..  /* Currently
2e890 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   this interface 
2e8a0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
2e8b0 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c  y the OP_IfSmall
2e8c0 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20  er.  ** opcode, 
2e8d0 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65  and it that case
2e8e0 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
2e8f0 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64   always be valid
2e900 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61   and.  ** will a
2e910 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61  lways point to a
2e920 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
2e930 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2e940 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2e950 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20  VALID) ) return 
2e960 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  -1;.  if( NEVER(
2e970 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
2e980 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d  f==0) ) return -
2e990 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e  1;..  n = pCur->
2e9a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2e9b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
2e9c0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2e9d0 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
2e9e0 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
2e9f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
2ea00 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2ea10 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2ea20 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2ea30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
2ea40 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a  * Return value:.
2ea50 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
2ea60 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73  OK        succes
2ea70 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
2ea80 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20  ONE      cursor 
2ea90 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
2eaa0 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20  ing at the last 
2eab0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74  element.**    ot
2eac0 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73  herwise        s
2ead0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
2eae0 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
2eaf0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2eb00 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2eb10 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2eb20 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2eb30 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2eb40 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2eb50 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2eb60 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2eb70 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2eb80 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2eb90 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2eba0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2ebb0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2ebc0 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2ebd0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2ebe0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2ebf0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2ec00 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2ec10 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2ec20 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2ec30 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
2ec40 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72  0x01 of the F ar
2ec50 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  gument in sqlite
2ec60 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20  3BtreeNext(C,F) 
2ec70 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a  is 1, then the.*
2ec80 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  * cursor corresp
2ec90 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2eca0 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2ecb0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2ecc0 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
2ecd0 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
2ece0 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
2ecf0 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2ed00 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  F argument.** is
2ed10 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
2ed20 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74  mplement.  SQLit
2ed30 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2ed40 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  tation does not 
2ed50 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74  use.** this hint
2ed60 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2ed70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2ed80 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2ed90 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2eda0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2edb0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2edc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2edd0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2ede0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2edf0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ee00 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2ee10 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2ee20 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ee30 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
2ee40 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ee50 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
2ee60 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2ee70 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2ee80 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2ee90 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2eea0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2eeb0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2eec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2eee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2eef0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2ef00 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2ef10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ef20 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
2ef30 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2ef40 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2ef50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ef60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ef70 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2ef80 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2ef90 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2efa0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2efb0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2efc0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2efd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2efe0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2eff0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2f010 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2f020 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2f030 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2f040 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2f050 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69   idx = ++pCur->i
2f060 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  x;.  assert( pPa
2f070 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
2f080 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2f090 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
2f0a0 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
2f0b0 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
2f0c0 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
2f0d0 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
2f0e0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2f0f0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
2f100 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
2f110 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
2f120 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
2f130 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
2f140 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
2f150 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
2f160 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
2f170 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2f180 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
2f190 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
2f1a0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
2f1b0 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
2f1c0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2f1d0 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
2f1e0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
2f1f0 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
2f200 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f210 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
2f220 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2f230 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2f240 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2f250 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2f260 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2f270 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
2f280 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f290 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
2f2a0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
2f2c0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f2d0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2f2e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2f2f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2f300 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
2f310 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2f320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2f330 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2f340 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
2f350 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
2f360 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78  }while( pCur->ix
2f370 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f380 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2f390 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2f3a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2f3b0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2f3c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f3d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f3e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2f3f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2f400 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2f410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2f420 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2f430 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2f440 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2f450 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2f470 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65  int flags){.  Me
2f480 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2f490 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f4a0 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55  ( flags );  /* U
2f4b0 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75  sed in COMDB2 bu
2f4c0 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c  t not native SQL
2f4d0 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ite */.  assert(
2f4e0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f4f0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f500 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2f510 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
2f520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2f530 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2f540 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f550 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2f560 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2f570 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2f580 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2f590 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2f5a0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
2f5b0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f5c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2f5d0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2f5e0 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
2f5f0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
2f600 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d  ( (++pCur->ix)>=
2f610 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2f620 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
2f630 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2f640 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Next(pCur);.  }.
2f650 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2f660 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2f670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2f680 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2f690 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2f6a0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2f6b0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2f6c0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2f6d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2f6e0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2f6f0 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76  ase..** Return v
2f700 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
2f710 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73   SQLITE_OK     s
2f720 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51  uccess.**     SQ
2f730 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20  LITE_DONE   the 
2f740 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2f750 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65  y on the first e
2f760 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
2f770 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72  ble.**     other
2f780 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69  wise     some ki
2f790 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75  nd of error occu
2f7a0 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  rred.**.** The m
2f7b0 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2f7c0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
2f7d0 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
2f7e0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2f7f0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2f800 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2f810 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
2f820 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2f830 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2f840 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
2f850 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
2f860 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2f870 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2f880 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
2f890 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
2f8a0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2f8b0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2f8c0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2f8d0 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
2f8e0 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
2f8f0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
2f900 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68  f bit 0x01 of th
2f910 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  e F argument to 
2f920 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f930 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20  ious(C,F) is 1, 
2f940 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73  then.** the curs
2f950 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  or corresponds t
2f960 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2f970 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2f980 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
2f990 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  ** skipped if th
2f9a0 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  e SQL index had 
2f9b0 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e  been a unique in
2f9c0 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75  dex.  The F argu
2f9d0 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e  ment is a.** hin
2f9e0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
2f9f0 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  nt.  The native 
2fa00 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2fa10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2fa20 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73   not.** use this
2fa30 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
2fa40 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
2fa50 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2fa60 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
2fa70 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2fa80 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2fa90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2faa0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2fab0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fac0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fad0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2fae0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2faf0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2fb00 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
2fb10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2fb20 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
2fb30 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2fb40 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
2fb50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2fb60 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2fb70 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2fb80 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2fb90 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
2fba0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2fbb0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2fbc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fbd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2fbe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2fbf0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2fc00 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2fc10 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
2fc20 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
2fc30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2fc40 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2fc50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fc60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2fc70 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2fc80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2fc90 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
2fca0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2fcb0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2fcc0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2fcd0 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
2fce0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
2fcf0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
2fd00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fd10 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2fd20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2fd30 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2fd40 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2fd50 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2fd60 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2fd70 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2fd80 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2fd90 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
2fda0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2fdb0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2fdc0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2fdd0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2fde0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2fdf0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2fe00 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2fe10 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2fe20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2fe30 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
2fe40 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2fe50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2fe60 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2fe70 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2fe80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fe90 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
2fea0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2feb0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
2fec0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2fed0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2fee0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2fef0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ff00 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
2ff10 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2ff20 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
2ff30 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2ff40 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
2ff50 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2ff60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ff70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ff80 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2ff90 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
2ffa0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2ffb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2ffc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ffd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2ffe0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2fff0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
30000 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  gs){.  assert( c
30010 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
30020 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
30030 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
30040 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
30050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
30060 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
30070 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30080 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53  _VALID );.  UNUS
30090 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c  ED_PARAMETER( fl
300a0 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20  ags );  /* Used 
300b0 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f  in COMDB2 but no
300c0 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  t native SQLite 
300d0 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  */.  pCur->curFl
300e0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
300f0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
30100 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
30110 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
30120 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
30130 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
30140 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
30150 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a   || pCur->ix==0.
30160 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67     || pCur->pPag
30170 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  e->leaf==0.  ){.
30180 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
30190 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a  Previous(pCur);.
301a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d    }.  pCur->ix--
301b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
301c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
301d0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
301e0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
301f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
30200 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
30210 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
30220 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
30230 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
30240 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
30250 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
30260 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
30270 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
30280 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
30290 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
302a0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
302b0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
302c0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
302d0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
302e0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
302f0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
30300 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
30310 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
30320 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
30330 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
30340 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
30350 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
30360 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
30370 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
30380 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
30390 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
303a0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
303b0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
303c0 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
303d0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
303e0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
303f0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
30400 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
30410 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
30420 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
30430 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
30440 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
30450 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
30460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
30470 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
30480 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
30490 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
304a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
304b0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
304c0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
304d0 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
304e0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
304f0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
30500 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
30510 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30520 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
30530 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
30540 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
30550 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
30560 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
30570 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
30580 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
30590 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
305a0 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
305b0 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
305c0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
305d0 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
305e0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
305f0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
30600 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
30610 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
30620 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
30630 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
30640 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
30650 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
30660 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
30670 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
30680 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
30690 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
306a0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
306b0 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
306c0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
306d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
306e0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
306f0 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
30700 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
30710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
30720 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
30730 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
30740 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
30750 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
30760 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
30770 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
30780 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
30790 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
307a0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
307b0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
307c0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
307d0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
307e0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
307f0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
30800 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
30810 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
30820 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
30830 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30840 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
30850 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
30860 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
30870 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
30880 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30890 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
308a0 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
308b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
308c0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
308d0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
308e0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
308f0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
30900 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
30910 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
30920 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
30930 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
30940 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
30950 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
30960 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
30970 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
30980 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
30990 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
309a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
309b0 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
309c0 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
309d0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
309e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
309f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
30a00 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
30a10 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
30a20 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
30a30 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
30a40 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
30a50 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
30a60 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
30a70 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
30a80 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
30a90 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
30aa0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
30ab0 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
30ac0 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
30ad0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
30ae0 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
30af0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
30b00 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
30b10 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
30b20 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
30b30 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
30b40 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
30b50 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
30b60 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
30b70 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
30b80 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
30b90 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
30ba0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
30bb0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
30bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30bd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
30be0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
30bf0 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
30c00 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
30c10 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
30c20 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
30c30 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
30c40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
30c50 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
30c60 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
30c70 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
30c80 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
30c90 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
30ca0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30cb0 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
30cc0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
30cd0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
30ce0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
30cf0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
30d00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
30d10 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
30d20 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
30d30 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
30d40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
30d50 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
30d60 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
30d70 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
30d80 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
30d90 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
30da0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
30db0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
30dc0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
30dd0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
30de0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30df0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
30e00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
30e10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30e20 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
30e30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
30e40 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
30e50 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
30e60 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
30e70 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
30e80 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
30e90 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
30ea0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
30eb0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
30ec0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
30ed0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
30ee0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
30ef0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
30f00 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
30f10 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
30f20 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
30f30 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
30f40 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
30f50 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
30f60 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
30f70 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
30f80 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
30f90 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
30fa0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
30fb0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
30fc0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
30fd0 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
30fe0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
30ff0 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
31000 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
31010 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
31020 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
31030 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31040 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
31050 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
31060 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
31070 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
31080 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
31090 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
310a0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
310b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
310c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
310d0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
310e0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
310f0 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
31100 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
31110 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
31120 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
31130 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
31140 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
31150 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
31160 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
31170 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
31180 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
31190 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
311a0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
311b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
311c0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
311d0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
311e0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
311f0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
31200 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
31210 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
31220 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31230 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76  RRUPT_PGNO(pPrev
31240 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75  Trunk ? pPrevTru
31250 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20  nk->pgno : 1);. 
31260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31270 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
31280 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
31290 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
312a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
312b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
312c0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
312d0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
312e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
312f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31300 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
31310 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
31320 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
31330 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
31340 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
31350 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
31360 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
31370 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
31380 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
31390 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
313a0 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
313b0 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
313c0 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
313d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
313e0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
313f0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
31400 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
31410 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
31420 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
31430 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
31440 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
31450 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
31460 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
31470 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
31480 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
31490 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
314a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
314b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
314c0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
314d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
314e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
314f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
31500 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
31510 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
31520 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31530 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31540 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
31550 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
31560 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
31570 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
31580 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31590 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
315a0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
315b0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
315c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
315d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
315e0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
315f0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
31600 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
31610 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31620 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
31630 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
31640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
31650 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
31660 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
31670 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
31680 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31690 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
316a0 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
316b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
316c0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
316d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
316e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
316f0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
31700 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
31710 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
31720 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
31730 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
31740 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
31750 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
31760 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
31770 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
31780 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
31790 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
317a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
317b0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
317c0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
317d0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
317e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
317f0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
31800 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
31810 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
31820 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
31830 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31840 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31850 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
31860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
31880 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31890 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
318a0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
318b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
318c0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
318d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
318e0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
318f0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
31900 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
31910 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
31920 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31930 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31940 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
31950 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
31960 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31980 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31990 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
319a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
319b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
319c0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
319d0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
319e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
319f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31a10 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
31a20 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
31a30 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
31a40 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
31a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
31a60 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
31a70 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
31a80 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
31a90 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
31aa0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
31ab0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
31ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31ad0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
31ae0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
31af0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
31b00 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
31b10 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
31b20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
31b30 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
31b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31b50 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
31b60 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
31b70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31b80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31b90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
31ba0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
31bb0 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
31bc0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
31bd0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31be0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
31bf0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
31c00 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
31c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c30 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31c40 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31c70 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
31c80 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31c90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31cb0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
31cc0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
31cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
31ce0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31cf0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
31d00 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
31d10 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
31d20 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
31d30 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
31d40 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
31d50 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
31d60 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
31d70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
31d80 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
31d90 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
31da0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
31db0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
31dc0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
31dd0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31de0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
31df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
31e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
31e10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
31e20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
31e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
31e40 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
31e50 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
31e60 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31e90 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
31ea0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
31eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31ec0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
31ed0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31ee0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31ef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31f00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31f10 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
31f20 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
31f30 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
31f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f50 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
31f60 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31f70 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
31f80 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
31f90 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
31fa0 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
31fb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31fc0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
31fd0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
31fe0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
31ff0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
32000 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
32010 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
32020 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
32030 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
32040 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
32050 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
32060 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
32070 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
32080 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
32090 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
320a0 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
320b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
320c0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
320d0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
320e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
320f0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
32100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
32110 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32130 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
32140 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
32150 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
32160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
32170 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
32180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
32190 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
321a0 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
321b0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
321c0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
321d0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
321e0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
321f0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
32200 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
32210 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
32220 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
32230 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
32240 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
32250 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
32260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32270 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
32290 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
322a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
322b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
322c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
322d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
322e0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
322f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
32300 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
32310 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
32320 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
32330 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
32340 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
32350 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
32360 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32370 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32380 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
323a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
323b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
323c0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
323d0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
323e0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
323f0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
32400 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
32410 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
32420 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
32430 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
32440 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
32450 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
32460 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
32470 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
32480 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
32490 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
324a0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
324b0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
324c0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
324d0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
324e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
324f0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
32500 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
32510 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
32520 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32530 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32540 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32560 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
32570 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32580 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
32590 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
325a0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
325b0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
325c0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
325d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
325e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
325f0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
32600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
32610 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
32620 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
32630 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
32640 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
32650 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
32660 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32670 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
32680 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
32690 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
326a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
326b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
326c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
326d0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
326e0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
326f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
32720 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
32730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32740 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
32750 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32770 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
32780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32790 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
327a0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
327b0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
327c0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
327d0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
327e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
327f0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
32800 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
32810 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
32820 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
32830 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
32840 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
32850 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
32860 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
32870 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
32880 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
32890 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
328a0 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
328b0 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
328c0 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
328d0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
328e0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
328f0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
32900 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
32910 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
32920 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
32930 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
32940 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
32950 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
32960 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
32970 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
32980 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
32990 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
329a0 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
329b0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
329c0 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
329d0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
329e0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
329f0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
32a00 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
32a10 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
32a20 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
32a30 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
32a40 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
32a50 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
32a60 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
32a70 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
32a80 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
32a90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
32aa0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
32ab0 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
32ac0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
32ad0 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
32ae0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
32af0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
32b00 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
32b10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
32b20 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
32b30 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
32b40 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
32b50 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
32b60 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
32b70 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
32b80 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
32b90 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
32ba0 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
32bb0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
32bc0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
32bd0 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
32be0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
32bf0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
32c00 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
32c10 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
32c20 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
32c30 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
32c40 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
32c50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32c60 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
32c70 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
32c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
32c90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
32ca0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
32cb0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
32cc0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
32cd0 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
32ce0 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
32cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32d00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
32d10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32d20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
32d30 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
32d40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
32d50 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
32d60 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
32d70 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
32d80 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
32d90 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
32da0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
32db0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
32dc0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
32dd0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
32de0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
32df0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
32e00 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
32e10 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
32e20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32e30 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
32e40 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
32e50 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
32e60 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
32e70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
32e80 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
32e90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32ea0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
32eb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32ec0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
32ed0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
32ee0 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
32ef0 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
32f00 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
32f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32f20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32f40 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
32f50 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
32f60 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
32f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
32f80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32f90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
32fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
32fb0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
32fc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
32fd0 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
32fe0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
32ff0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
33000 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
33010 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
33020 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
33030 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
33040 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
33050 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
33060 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
33070 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
33080 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
33090 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
330a0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
330b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
330c0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
330d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
330e0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
330f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
33100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33110 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33120 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
33130 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
33140 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
33150 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
33160 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
33170 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
33180 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
33190 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
331a0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
331b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
331c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
331d0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
331e0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
331f0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
33200 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
33210 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
33220 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
33230 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
33240 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33250 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
33260 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
33270 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33280 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
33290 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
332a0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
332b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
332c0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
332d0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
332e0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
332f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
33300 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
33310 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
33320 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
33330 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
33340 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
33350 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
33360 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
33370 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
33380 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
33390 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
333a0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
333b0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
333c0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
333d0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
333e0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
333f0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
33400 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
33410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
33420 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
33430 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
33440 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
33450 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
33460 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
33470 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
33480 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
33490 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
334a0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
334b0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
334c0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
334d0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
334e0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33500 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
33510 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
33520 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
33530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33540 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33550 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
33560 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
33570 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
33580 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
33590 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
335a0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
335b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
335c0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
335d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
335e0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
335f0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
33600 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
33610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33620 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
33630 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
33640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33660 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
33670 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
33680 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
33690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
336a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
336b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
336c0 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
336d0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
336e0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
336f0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
33700 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
33710 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
33720 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33730 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
33740 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
33750 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
33760 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
33770 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
33780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
33790 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
337a0 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
337b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
337c0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
337d0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
337e0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
337f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33800 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
33810 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
33820 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33830 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
33840 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33850 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
33860 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33870 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
33880 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
33890 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
338a0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
338b0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
338c0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
338d0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
338e0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
338f0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
33900 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
33910 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
33920 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
33930 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
33940 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
33950 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
33960 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
33970 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
33980 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33990 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
339a0 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
339b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
339c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
339d0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
339e0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
339f0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
33a00 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
33a10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
33a20 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
33a30 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
33a40 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
33a50 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
33a60 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
33a70 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
33a80 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
33a90 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
33aa0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
33ab0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
33ac0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
33ad0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
33ae0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33af0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
33b00 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
33b10 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
33b20 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
33b30 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
33b40 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
33b50 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
33b60 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
33b70 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
33b80 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
33b90 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
33ba0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
33bb0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
33bc0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
33bd0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
33be0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
33bf0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
33c00 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
33c10 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
33c20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
33c30 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
33c40 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
33c50 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
33c60 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
33c70 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
33c80 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
33c90 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
33ca0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
33cb0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
33cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33cd0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
33ce0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
33cf0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
33d00 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
33d10 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33d20 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
33d30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
33d40 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
33d50 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
33d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33d70 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
33d80 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33d90 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
33da0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
33db0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
33dc0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
33dd0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
33de0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
33df0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
33e00 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
33e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
33e20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
33e30 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33e40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
33e50 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
33e60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
33e70 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
33e80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33e90 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
33ea0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
33eb0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
33ec0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
33ed0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
33ee0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
33ef0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
33f00 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
33f10 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
33f20 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
33f30 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
33f40 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
33f50 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
33f60 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
33f70 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
33f80 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
33f90 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
33fa0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
33fb0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
33fc0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
33fd0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
33fe0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
33ff0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
34000 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
34010 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
34020 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
34030 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
34040 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
34050 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
34060 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
34070 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
34080 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
34090 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
340a0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
340b0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
340c0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
340d0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
340e0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
340f0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
34100 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
34110 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
34120 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
34130 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
34140 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
34150 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
34160 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
34170 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
34180 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
34190 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
341a0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
341b0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
341c0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
341d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
341e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
341f0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
34200 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
34210 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
34220 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
34230 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
34240 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
34250 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
34260 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
34270 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
34280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
34290 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
342a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
342b0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
342c0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
342d0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
342e0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
342f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34300 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
34310 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
34320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34340 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
34350 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
34360 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
34370 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34380 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
34390 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
343a0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
343b0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
343c0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
343d0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
343e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
343f0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
34400 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
34410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
34420 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
34430 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
34440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34450 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
34460 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
34470 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
34480 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
34490 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
344a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
344b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
344c0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
344d0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
344e0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
344f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
34500 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
34510 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
34520 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
34530 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
34540 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
34550 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
34560 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
34570 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
34580 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
34590 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
345a0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
345b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
345c0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
345d0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
345e0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
345f0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
34600 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
34610 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
34620 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
34630 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
34640 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
34650 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
34660 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
34670 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
34680 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
34690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
346a0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
346b0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
346c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
346d0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
346e0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
346f0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
34700 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
34710 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
34720 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
34730 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34740 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
34750 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
34760 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
34770 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
34780 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
34790 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
347a0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
347b0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
347c0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
347d0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
347e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
347f0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
34800 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
34810 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
34820 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
34830 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
34840 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
34850 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
34860 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
34870 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
34880 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
34890 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
348a0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
348b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
348c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
348d0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
348e0 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69   Store.** size i
348f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
34900 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e   the cell in pIn
34910 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fo..*/.static in
34920 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
34930 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
34940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
34950 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
34960 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
34970 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34980 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
34990 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
349a0 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
349b0 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
349c0 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61   /* Size informa
349d0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
349e0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ell */.){.  BtSh
349f0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
34a00 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
34a10 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
34a20 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
34a30 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
34a40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34a50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
34a60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
34a70 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
34a80 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
34a90 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  fo);.  if( pInfo
34aa0 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d  ->nLocal==pInfo-
34ab0 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  >nPayload ){.   
34ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34ad0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
34ae0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
34af0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
34b00 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
34b10 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f   if( pCell+pInfo
34b20 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67  ->nSize-1 > pPag
34b30 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
34b40 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
34b50 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
34b60 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
34b70 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
34b80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
34b90 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
34ba0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
34bb0 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
34bc0 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
34bd0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
34be0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  Bt;.  assert( pB
34bf0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
34c00 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
34c10 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
34c20 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
34c30 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
34c40 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
34c50 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
34c60 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
34c70 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
34c80 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
34c90 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
34ca0 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
34cb0 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
34cc0 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
34cd0 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
34ce0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
34cf0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
34d00 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
34d10 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
34d20 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
34d30 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
34d40 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
34d50 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
34d60 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
34d70 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
34d80 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
34d90 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
34da0 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
34db0 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
34dc0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
34dd0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
34de0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
34df0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
34e00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34e10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34e20 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
34e30 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
34e40 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
34e50 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
34e60 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
34e70 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
34e80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
34e90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
34ea0 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
34eb0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
34ec0 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
34ed0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
34ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
34ef0 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
34f00 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
34f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
34f20 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
34f30 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
34f40 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
34f50 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
34f60 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
34f70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
34f80 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
34f90 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
34fa0 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
34fb0 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
34fc0 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
34fd0 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
34fe0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
34ff0 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
35000 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
35010 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
35020 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
35030 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
35040 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
35050 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
35060 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
35070 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
35080 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
35090 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
350a0 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
350b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
350c0 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
350d0 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
350e0 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
350f0 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
35100 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
35110 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
35120 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
35130 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
35140 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
35150 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
35160 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
35170 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
35180 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
35190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
351a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
351b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
351c0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
351d0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
351e0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
351f0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
35200 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35210 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
35220 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
35230 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35240 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
35250 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
35260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35270 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
35280 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
35290 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
352a0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
352b0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
352c0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
352d0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
352e0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
352f0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
35300 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
35310 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
35320 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
35330 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
35340 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
35350 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
35360 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
35370 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
35380 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
35390 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
353a0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
353b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
353c0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
353d0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
353e0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
353f0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
35400 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
35410 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
35420 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
35430 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
35440 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
35450 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
35460 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
35470 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
35480 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
35490 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
354a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
354b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
354c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
354d0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
354e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
354f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
35500 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
35510 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
35520 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
35530 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
35540 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
35550 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
35560 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
35570 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
35580 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
35590 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
355a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
355b0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
355c0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
355d0 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a  Src, n, rc, mn;.
355e0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
355f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
35600 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e  elease;.  unsign
35610 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
35620 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35630 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
35640 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
35650 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20  gno pgnoOvfl;.  
35660 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
35670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35680 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35690 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
356a0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
356b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
356c0 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
356d0 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
356e0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
356f0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
35700 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
35710 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
35720 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
35730 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
35740 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
35750 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
35760 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
35770 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
35780 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
35790 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
357a0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
357b0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
357c0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
357d0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
357e0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
357f0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
35800 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
35810 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
35820 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
35830 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
35840 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
35850 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
35860 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
35870 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
35880 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
35890 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
358a0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
358b0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
358c0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
358d0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
358e0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
358f0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
35900 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
35910 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
35920 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
35930 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
35940 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
35950 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
35960 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
35970 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
35980 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
35990 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
359a0 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
359b0 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
359c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
359d0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
359e0 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20  d */.  pPayload 
359f0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
35a00 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  ];.  if( nPayloa
35a10 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
35a20 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
35a30 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
35a40 63 61 73 65 20 77 68 65 72 65 20 65 76 65 72 79  case where every
35a50 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68  thing fits on th
35a60 65 20 62 74 72 65 65 20 70 61 67 65 0a 20 20 20  e btree page.   
35a70 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66   ** and no overf
35a80 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 72 65  low pages are re
35a90 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e  quired. */.    n
35aa0 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
35ab0 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
35ac0 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
35ad0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
35ae0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
35af0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
35b00 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73  ize = n;.    ass
35b10 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c  ert( nSrc<=nPayl
35b20 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oad );.    testc
35b30 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f  ase( nSrc<nPaylo
35b40 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ad );.    memcpy
35b50 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
35b60 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73   nSrc);.    mems
35b70 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63  et(pPayload+nSrc
35b80 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53  , 0, nPayload-nS
35b90 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
35ba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
35bb0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
35bc0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
35bd0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
35be0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  of the content w
35bf0 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  ill need.  ** to
35c00 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72   spill onto over
35c10 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f  flow pages..  */
35c20 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  .  mn = pPage->m
35c30 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d  inLocal;.  n = m
35c40 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
35c50 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
35c60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35c70 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
35c80 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
35c90 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
35ca0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
35cb0 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
35cc0 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
35cd0 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
35ce0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
35cf0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
35d00 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50  Header + 4;.  pP
35d10 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
35d20 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52  eader+n];.  pToR
35d30 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67  elease = 0;.  pg
35d40 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42  noOvfl = 0;.  pB
35d50 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
35d60 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
35d70 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
35d80 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
35d90 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
35da0 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
35db0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
35dc0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
35dd0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
35de0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
35df0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
35e00 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
35e10 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
35e20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
35e30 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
35e40 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
35e50 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e70 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
35e80 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
35e90 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
35ea0 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
35eb0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
35ec0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
35ed0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
35ee0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
35ef0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
35f00 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
35f10 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
35f20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
35f30 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
35f40 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
35f50 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
35f60 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
35f70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
35f80 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
35f90 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
35fa0 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
35fb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
35fc0 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
35fd0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
35fe0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
35ff0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
36000 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
36010 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29  ( nHeader==(int)
36020 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
36030 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
36040 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
36050 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  ==pX->nKey );.  
36060 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
36070 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
36080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
36090 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
360a0 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23  .nLocal );.  }.#
360b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
360c0 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
360d0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
360e0 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
360f0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
36100 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
36110 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61  1 ){.    n = nPa
36120 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
36130 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
36140 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
36150 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
36160 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
36170 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
36180 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
36190 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
361a0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
361b0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
361c0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
361d0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
361e0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
361f0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
36200 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
36210 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
36220 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
36230 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
36240 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
36250 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
36260 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
36270 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
36280 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
36290 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
362a0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
362b0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
362c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
362d0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
362e0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
362f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36300 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36310 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
36320 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d  rc>=n ){.      m
36330 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
36340 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
36350 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29  lse if( nSrc>0 )
36360 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63  {.      n = nSrc
36370 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
36380 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
36390 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
363a0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
363b0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
363c0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
363d0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61  = n;.    if( nPa
363e0 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b  yload<=0 ) break
363f0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
36400 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
36410 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
36420 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
36430 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73   -= n;.    if( s
36440 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
36450 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f       MemPage *pO
36460 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  vfl = 0;.#ifndef
36470 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36480 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
36490 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
364a0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
364b0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
364c0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
364d0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
364e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
364f0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
36500 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
36510 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
36520 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
36530 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
36540 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
36550 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
36560 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
36570 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
36580 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
36590 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
365a0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
365b0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
365c0 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
365d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
365e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
365f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
36600 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
36610 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
36620 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
36630 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
36640 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
36650 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
36660 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
36670 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
36680 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
36690 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
366a0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
366b0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
366c0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
366d0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
366e0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
366f0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
36700 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
36710 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
36720 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
36730 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
36740 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
36750 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
36760 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
36770 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
36780 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
36790 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
367a0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
367b0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
367c0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
367d0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
367e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
367f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
36800 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36810 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
36820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
36830 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
36840 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
36850 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
36860 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
36870 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
36880 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
36890 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
368a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
368b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
368c0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
368d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
368e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
368f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36900 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36910 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
36920 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36930 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
36940 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
36950 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
36960 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
36970 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
36980 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
36990 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
369a0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
369b0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
369c0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
369d0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
369e0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
369f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
36a00 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
36a10 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
36a20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
36a30 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
36a40 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
36a50 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
36a60 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
36a70 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
36a80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
36a90 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
36aa0 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
36ab0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
36ac0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
36ad0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
36ae0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36af0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36b00 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
36b10 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
36b20 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
36b30 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
36b40 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
36b50 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
36b60 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
36b70 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
36b80 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
36b90 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
36ba0 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
36bb0 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
36bc0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
36bd0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36be0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  4;.    }.  }.  r
36bf0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
36c00 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
36c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36c20 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
36c30 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
36c40 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
36c50 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
36c60 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
36c70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
36c80 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
36c90 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
36ca0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
36cb0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
36cc0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
36cd0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
36ce0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
36cf0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
36d00 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
36d10 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
36d20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
36d30 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
36d40 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
36d50 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
36d60 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
36d70 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
36d80 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
36d90 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
36da0 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
36db0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
36dc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
36dd0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
36de0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
36df0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
36e00 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
36e10 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
36e20 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
36e30 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
36e40 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
36e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36e60 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
36e70 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
36e80 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
36e90 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
36ea0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
36eb0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
36ec0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
36ed0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
36ee0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
36ef0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
36f00 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
36f10 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
36f20 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
36f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36f40 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36f50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
36f60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36f70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36f80 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
36f90 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
36fa0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
36fb0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
36fc0 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
36fd0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
36fe0 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
36ff0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
37000 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
37010 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
37020 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
37030 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
37040 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37050 20 29 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20   );.  if( pc+sz 
37060 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
37070 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
37080 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
37090 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
370a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
370b0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
370c0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
370d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
370e0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
370f0 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
37100 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
37110 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
37120 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
37130 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
37140 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
37150 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
37160 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
37170 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
37180 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
37190 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
371a0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
371b0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
371c0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
371d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371e0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
371f0 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
37200 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
37210 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
37220 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
37230 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
37240 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
37250 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
37260 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
37270 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
37280 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
37290 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
372a0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
372b0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
372c0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
372d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
372e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
372f0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
37300 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
37310 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
37320 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
37330 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
37340 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
37350 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
37360 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
37370 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
37380 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
37390 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
373a0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
373b0 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
373c0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
373d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
373e0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
373f0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
37400 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
37410 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
37420 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
37430 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
37440 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
37450 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
37460 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
37470 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
37480 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
37490 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65  .** *pRC must be
374a0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
374b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
374c0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
374d0 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
374e0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
374f0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
37500 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
37510 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
37520 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
37530 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
37540 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
37550 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
37560 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
37570 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
37580 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
37590 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
375a0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
375b0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
375c0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
375d0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
375e0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
375f0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
37600 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
37610 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
37620 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
37630 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
37640 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
37650 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
37660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
37670 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
37680 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
37690 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
376a0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
376b0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
376c0 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
376d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
376e0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
376f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
37700 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
37710 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
37720 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
37730 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
37740 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
37750 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
37760 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
37770 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
37780 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73  nserted */..  as
37790 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49  sert( *pRC==SQLI
377a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
377b0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
377c0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
377d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
377e0 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
377f0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
37800 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
37810 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
37820 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
37830 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
37840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37850 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
37860 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
37870 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
37880 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
37890 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
378a0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
378b0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
378c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
378d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
378e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
378f0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
37900 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
37910 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
37920 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
37930 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
37940 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
37950 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
37960 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
37970 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
37980 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
37990 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
379a0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
379b0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
379c0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
379d0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
379e0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
379f0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
37a00 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
37a10 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
37a20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
37a30 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
37a40 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
37a50 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
37a60 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c   sz==pPage->xCel
37a70 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65  lSize(pPage, pCe
37a80 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
37a90 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
37aa0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
37ab0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
37ac0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
37ad0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
37ae0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
37af0 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
37b00 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
37b10 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
37b20 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
37b30 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
37b40 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
37b50 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
37b60 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
37b70 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67  /* Comparison ag
37b80 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d  ainst ArraySize-
37b90 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20  1 since we hold 
37ba0 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73  back one extra s
37bb0 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  lot.    ** as a 
37bc0 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e  contingency.  In
37bd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65   other words, ne
37be0 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68  ver need more th
37bf0 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20  an 3 overflow.  
37c00 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34    ** slots but 4
37c10 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
37c20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
37c30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37c40 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50  j < ArraySize(pP
37c50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29  age->apOvfl)-1 )
37c60 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
37c70 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
37c80 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
37c90 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
37ca0 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
37cb0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
37cc0 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61  ccur, they are a
37cd0 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c  lways sequential
37ce0 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73   and in.    ** s
37cf0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68  orted order.  Th
37d00 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72  is invariants ar
37d10 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74  ise because mult
37d20 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63  iple overflows c
37d30 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  an.    ** only o
37d40 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74  ccur when insert
37d50 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ing divider cell
37d60 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
37d70 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20  t page during.  
37d80 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20    ** balancing, 
37d90 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73  and the dividers
37da0 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e   are adjacent an
37db0 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f  d sorted..    */
37dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
37dd0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76  0 || pPage->aiOv
37de0 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29  fl[j-1]<(u16)i )
37df0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69  ; /* Overflows i
37e00 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
37e10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
37e20 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e  =0 || i==pPage->
37e30 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b  aiOvfl[j-1]+1 );
37e40 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20     /* Overflows 
37e50 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a  are sequential *
37e60 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
37e70 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
37e80 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
37e90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
37ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37eb0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
37ec0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
37ed0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
37ee0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37ef0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37f00 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37f10 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
37f20 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->aData;.    ass
37f30 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65  ert( &data[pPage
37f40 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70  ->cellOffset]==p
37f50 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29  Page->aCellIdx )
37f60 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
37f70 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
37f80 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
37f90 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
37fa0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
37fb0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
37fc0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
37fd0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
37fe0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
37ff0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
38000 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
38010 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73  sfully */.    as
38020 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29  sert( idx >= 0 )
38030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
38040 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  x >= pPage->cell
38050 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
38060 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55  nCell+2 || CORRU
38070 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
38080 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
38090 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
380a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
380b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
380c0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
380d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
380e0 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
380f0 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
38100 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
38110 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
38120 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
38130 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65      pIns = pPage
38140 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32  ->aCellIdx + i*2
38150 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49  ;.    memmove(pI
38160 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70  ns+2, pIns, 2*(p
38170 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29  Page->nCell - i)
38180 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
38190 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20  pIns, idx);.    
381a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
381b0 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74      /* increment
381c0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20   the cell count 
381d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61  */.    if( (++da
381e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
381f0 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74  set+4])==0 ) dat
38200 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
38210 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73  et+3]++;.    ass
38220 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
38230 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
38240 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d  fset+3])==pPage-
38250 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65  >nCell );.#ifnde
38260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
38270 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
38280 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
38290 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
382a0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
382b0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
382c0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
382d0 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
382e0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
382f0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
38300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
38310 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
38320 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
38330 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
38340 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
38350 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
38360 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
38370 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62  * A CellArray ob
38380 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
38390 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72  cache of pointer
383a0 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20  s and sizes for 
383b0 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65  a.** consecutive
383c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c   sequence of cel
383d0 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ls that might be
383e0 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c   held on multipl
383f0 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
38400 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
38410 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
38420 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
38430 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
38440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38450 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
38460 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
38470 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
38480 20 20 20 20 20 20 20