/ Hex Artifact Content
Login

Artifact 5a6efa29cc6b78f3151a64424bd2f3c28e0158019c45786635ef5ff79d94e850:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3aa0: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3ab0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3ac0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3ad0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3ae0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3af0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3b00: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b10: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b20: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b30: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b40: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b50: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b60: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3b70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b80: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3b90: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
3ba0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
3bb0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
3bc0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
3bd0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
3be0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
3bf0: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
3c00: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
3c10: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
3c20: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
3c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3c40: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
3c50: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
3c60: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
3c70: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
3c80: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
3c90: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
3ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3cb0: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
3cc0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
3cd0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
3ce0: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
3cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3d00: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
3d10: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
3d20: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
3d30: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
3d40: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
3d50: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
3d60: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
3d70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3d80: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
3d90: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
3da0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3db0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
3dc0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
3dd0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3de0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
3df0: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
3e00: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
3e10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e20: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3e30: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
3e40: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
3e50: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
3e70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
3ea0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3eb0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
3ec0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
3ed0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
3ee0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ef0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3f00: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3f10: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3f20: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3f30: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f40: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3f50: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3f60: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3f70: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3f80: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3f90: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3fa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3fb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3fc0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
3fd0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
3fe0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
3ff0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4000: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
4010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4020: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
4030: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4040: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
4050: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
4060: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
4070: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
4080: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
4090: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
40a0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
40b0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
40c0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
40d0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
40e0: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40f0: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
4100: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
4110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
4120: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
4130: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
4140: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4150: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
4160: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
4170: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
4180: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
4190: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
41a0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
41b0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
41c0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41d0: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
41e0: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
41f0: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
4200: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
4210: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
4220: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4230: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
4240: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
4250: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
4260: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
4270: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
4280: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4290: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
42a0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
42b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
42c0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
42d0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
42e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
42f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
4300: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
4310: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4330: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
4340: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
4350: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
4360: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
4370: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
4380: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4390: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
43a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
43b0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
43c0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
43d0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
43e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
43f0: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4400: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4410: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
4420: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
4430: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
4440: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
4450: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
4460: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
4470: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
44a0: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
44b0: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
44c0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
44d0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
44e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
4500: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
4510: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4520: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4530: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4540: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4550: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4560: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4570: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
4580: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4590: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
45a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
45b0: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
45c0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
45d0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
45e0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
45f0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
4600: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
4610: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
4620: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4630: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4640: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4650: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4660: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4670: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4680: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4690: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
46a0: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
46b0: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
46c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
46d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
46e0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
46f0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
4700: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
4710: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
4720: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4730: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4740: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4750: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4760: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4770: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4780: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4790: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
47a0: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
47b0: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
47c0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
47d0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
47e0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
47f0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
4800: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
4810: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
4820: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4830: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4840: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4850: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4860: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4870: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4880: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4890: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
48a0: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
48b0: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
48c0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
48d0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
48e0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
48f0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
4900: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
4910: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
4920: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4930: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4940: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4950: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4960: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4970: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4980: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4990: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
49a0: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
49b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
49c0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
49d0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
49e0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
49f0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
4a00: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
4a10: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4a20: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4a30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4a40: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4a50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4a60: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4a70: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4a80: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4a90: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4aa0: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4ab0: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4ac0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4ad0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4ae0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4af0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
4b00: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
4b10: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
4b20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4b30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4b40: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4b50: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4b60: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4b70: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4b80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4b90: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4ba0: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4bb0: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4bc0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4bd0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4be0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4bf0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
4c00: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
4c10: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
4c20: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4c30: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4c50: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4c60: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4c70: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4c80: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4c90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4ca0: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4cb0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4cc0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
4cd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ce0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
4cf0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4d00: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
4d10: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
4d20: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4d30: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4d40: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4d50: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4d60: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4d70: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4d80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
4da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4db0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4dc0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4dd0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4de0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4df0: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4e00: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
4e10: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
4e30: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
4e40: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
4e50: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
4e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4e70: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4e80: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4e90: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4ea0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4eb0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4ec0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4ed0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4ee0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4ef0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4f00: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
4f10: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
4f20: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
4f30: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f40: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
4f50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4f60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4f70: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4f80: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4f90: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4fa0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4fb0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4fc0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4fd0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
4fe0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
4ff0: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
5000: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
5010: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
5020: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
5030: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
5040: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
5050: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
5060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5070: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
5080: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
5090: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
50a0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
50b0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
50c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
50d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
50e0: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
50f0: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
5100: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
5110: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
5120: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5130: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
5140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
5150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
5160: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
5170: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
5180: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
5190: 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ]);.    pCur->ap
51a0: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  Page[i] = 0;.  }
51b0: 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
51c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
51d0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
51e0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
51f0: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
5200: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
5210: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
5220: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
5230: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
5240: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5250: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5260: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
5270: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
5280: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
5290: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
52a0: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
52b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
52c0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
52d0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
52e0: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
52f0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
5300: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
5310: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
5320: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
5330: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
5340: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
5350: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
5360: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
5370: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
5380: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
5390: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
53a0: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
53b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
53c0: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
53d0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
53e0: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
53f0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
5400: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
5410: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
5420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5430: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
5440: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5460: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
5470: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
5480: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5490: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
54a0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
54b0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
54c0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
54d0: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
54e0: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
54f0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
5500: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
5510: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
5520: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5530: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
5540: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
5550: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
5560: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
5570: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
5580: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
5590: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
55a0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
55b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55c0: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
55d0: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
55e0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
55f0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5600: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5610: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5620: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
5630: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
5640: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5650: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5660: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5670: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
56a0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
56d0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
56e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
56f0: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
5700: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
5710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5720: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
5730: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5740: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
5750: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
5760: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
5770: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
5780: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
5790: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
57a0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
57b0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
57c0: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
57d0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
57e0: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
57f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
5800: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
5810: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
5820: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5830: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5840: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5850: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
5860: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5870: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5880: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5890: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
58a0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
58b0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
58c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
58d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
58e0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
58f0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5900: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5910: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5920: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
5940: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
5950: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
5960: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
5970: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5990: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
59a0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
59b0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
59c0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
59d0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
59e0: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
59f0: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
5a00: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
5a10: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
5a20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5a30: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5a40: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5a50: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5a60: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5a70: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
5a80: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
5a90: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
5aa0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
5ab0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
5ac0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5ad0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5ae0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5af0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5b00: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5b10: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5b20: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5b30: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5b40: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5b50: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5b60: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
5b70: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
5b80: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
5b90: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
5ba0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
5bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
5bc0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5bd0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5be0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5bf0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5c00: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5c10: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5c20: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5c30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
5c40: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
5c50: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
5c60: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
5c70: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
5c80: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
5c90: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
5ca0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5cb0: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
5cc0: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
5cd0: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
5ce0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5cf0: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
5d00: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
5d10: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
5d20: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
5d30: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
5d40: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
5d50: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
5d60: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
5d70: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
5d80: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
5d90: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
5da0: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
5db0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
5dc0: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
5dd0: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
5de0: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
5df0: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
5e00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
5e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
5e20: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
5e30: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5e40: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
5e50: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
5e60: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
5e70: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
5e80: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
5e90: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
5ea0: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
5eb0: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
5ec0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
5ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ee0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
5ef0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f00: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
5f10: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
5f20: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5f30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f40: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5f50: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5f60: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
5f70: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
5f80: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
5f90: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
5fa0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5fb0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5fc0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5fd0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5fe0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
5ff0: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
6000: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6010: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
6020: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
6030: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
6040: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
6050: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
6060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6070: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
6080: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
6090: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
60a0: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
60b0: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
60c0: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
60d0: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
60e0: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
60f0: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
6100: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
6110: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
6120: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
6130: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
6140: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
6150: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
6160: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
6170: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
6180: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
6190: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
61a0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
61b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
61c0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
61d0: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
61e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
61f0: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
6200: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
6210: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
6220: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
6230: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
6240: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
6250: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
6260: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
6270: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
6280: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
6290: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
62a0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
62b0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
62c0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
62d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
62e0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
62f0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
6300: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
6310: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
6320: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
6330: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
6340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
6350: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
6360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6390: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
63a0: 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Page>=0 );.     
63b0: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
63c0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
63d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
63e0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
63f0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
6420: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
6430: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
6440: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6450: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
6460: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6470: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
6480: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6490: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
64a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
64b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
64c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
64d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
64e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
64f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
6500: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
6510: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
6520: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
6530: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
6540: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
6550: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
6560: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
6570: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
6580: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
6590: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
65a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
65b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
65c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
65d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
65e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
65f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
6600: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
6610: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
6620: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
6630: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
6640: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
6650: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
6660: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
6670: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
6680: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
6690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
66a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
66b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
66c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
66d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
66e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
66f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
6700: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6720: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
6730: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
6740: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
6750: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
6760: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20   index key */.. 
6770: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
6780: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
6790: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
67a0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
67b0: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
67c0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43  npackedRecord(pC
67d0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ur->pKeyInfo);. 
67e0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
67f0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
6800: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
6810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
6820: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
6830: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
6840: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
6850: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
6860: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
6870: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6880: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
6890: 4f 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  O(pCur->apPage[p
68a0: 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
68b0: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  o);.      goto m
68c0: 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20  oveto_done;.    
68d0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
68e0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
68f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6900: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6910: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6920: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6930: 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a  s);.moveto_done:
6940: 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
6950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6960: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
6970: 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29  fo->db, pIdxKey)
6980: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69a0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69b0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
69c0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
69d0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
69e0: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
69f0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a00: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a10: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a20: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a30: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a40: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a50: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6a60: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6a70: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6a80: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6a90: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6aa0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6ab0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6ae0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6af0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b00: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b10: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b20: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b30: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b40: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b50: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6b60: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6b70: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6b80: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6b90: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6ba0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bb0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6bc0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6bd0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6be0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6bf0: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c00: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c10: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6c60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6c70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6c80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6c90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ca0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cb0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6cc0: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6cd0: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6cf0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d00: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d20: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d40: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d50: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6d60: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6d70: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6d80: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6d90: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6da0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6db0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6dc0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6dd0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6de0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6df0: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e00: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e10: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e20: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e30: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e40: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e50: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6e60: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6e70: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6e80: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6e90: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ea0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6eb0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6ec0: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6ed0: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6ee0: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6ef0: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f00: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f10: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f20: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f30: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f40: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f50: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6f60: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6f70: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6f80: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6f90: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fa0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6fb0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6fc0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
6fd0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6fe0: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
6ff0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7000: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7010: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7020: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
7030: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
7040: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
7050: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7060: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
7070: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
7080: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
7090: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
70a0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
70b0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
70c0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
70d0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
70e0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
70f0: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
7100: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
7110: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
7120: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
7130: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
7140: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
7150: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
7160: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
7170: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
7180: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
7190: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
71a0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
71b0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
71c0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
71d0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
71e0: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
71f0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
7200: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7210: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
7220: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
7230: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
7240: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7250: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
7260: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
7270: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
7280: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
7290: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
72a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
72b0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
72c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72d0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
72e0: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
72f0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7300: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
7310: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
7320: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7330: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
7340: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
7350: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
7360: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44  VALID ){.    *pD
7370: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
7380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7390: 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
73a0: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Next==0 );.    *
73b0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
73c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
73e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
73f0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7400: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7410: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7420: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7430: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7440: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7450: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7460: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7470: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7480: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7490: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
74a0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
74b0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
74c0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
74d0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
74e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
74f0: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7500: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7510: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7520: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7530: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7540: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7550: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7560: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7580: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7590: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
75a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
75b0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
75c0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
75d0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
75e0: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
75f0: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7600: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7610: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7620: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7640: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7650: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7660: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7670: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7680: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7690: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
76a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
76b0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
76c0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
76d0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
76e0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
76f0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7700: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7710: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7720: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7730: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7740: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7750: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7760: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
7770: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
7780: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
7790: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
77a0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
77b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
77c0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
77d0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
77e0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
77f0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
7800: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7810: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7820: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
7830: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7840: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
7850: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
7860: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
7870: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
7880: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7890: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
78a0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
78b0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
78c0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
78d0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
78e0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
78f0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7900: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
7910: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7920: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7930: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
7940: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
7950: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7960: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
7970: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
7980: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
7990: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
79a0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
79b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
79c0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
79d0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
79e0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
79f0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
7a00: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
7a10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
7a20: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
7a30: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
7a40: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
7a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7a60: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
7a70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7a80: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
7a90: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
7aa0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
7ab0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7ac0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7ad0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7ae0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7af0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7b00: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7b10: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7b20: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7b30: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7b40: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7b50: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7b60: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7b70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7b80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7b90: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
7ba0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
7bb0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
7bc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7bd0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7be0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
7bf0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c00: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7c10: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7c20: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7c30: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7c40: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7c50: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7c60: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7c70: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7c80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7c90: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7ca0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7cb0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7cc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7cd0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7ce0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7cf0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7d00: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7d10: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7d20: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
7d30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
7d50: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
7d60: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
7d70: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7d80: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
7d90: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
7da0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7db0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7dc0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
7dd0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
7de0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7df0: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7e00: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
7e10: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7e20: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7e30: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
7e40: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
7e50: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
7e60: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7e70: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
7e80: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
7e90: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
7ea0: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
7eb0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
7ec0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
7ed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7ee0: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
7ef0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f10: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7f20: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
7f30: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
7f40: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
7f50: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
7f60: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
7f70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7f80: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
7f90: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
7fa0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
7fb0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7fc0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
7fd0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
7fe0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
7ff0: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8000: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8010: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8020: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8030: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8040: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8050: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8060: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8070: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
8080: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
8090: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
80a0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
80b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
80c0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
80d0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
80e0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80f0: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8100: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8110: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
8120: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8130: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
8140: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8150: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8160: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
8170: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
8180: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8190: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
81a0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
81b0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
81c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
81e0: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
81f0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
8200: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
8210: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8220: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
8230: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8240: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
8250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8260: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
8270: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
8280: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
8290: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
82a0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82b0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
82c0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
82d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
82e0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
82f0: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8300: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8310: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8320: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8330: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8340: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8350: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8360: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
8370: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
8380: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
8390: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
83a0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
83b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
83c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
83d0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
83e0: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
83f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8400: 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70  UPT_PGNO(iPtrmap
8410: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8420: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
8430: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
8440: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8450: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8460: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8470: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8480: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8490: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
84a0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
84b0: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
84c0: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
84d0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
84e0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
84f0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
8500: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
8510: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
8520: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
8530: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
8540: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8550: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8560: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8570: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8580: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8590: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
85a0: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
85b0: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
85c0: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
85d0: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
85e0: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
85f0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
8600: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
8610: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
8620: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
8630: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
8640: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8650: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8660: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8670: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8680: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8690: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
86a0: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
86b0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
86c0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
86d0: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
86e0: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
86f0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
8700: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
8710: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
8720: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
8730: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
8740: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8750: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8770: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8780: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8790: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
87a0: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
87b0: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
87c0: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
87d0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
87e0: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
87f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
8800: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
8810: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
8820: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
8830: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
8840: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8850: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8860: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8870: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8880: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8890: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
88a0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
88b0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
88c0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
88d0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
88e0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
88f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
8900: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
8910: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
8920: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8930: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
8940: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8950: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8960: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8970: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8980: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8990: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
89a0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
89b0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
89c0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
89d0: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
89e0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
89f0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
8a00: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
8a10: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8a20: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
8a30: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
8a40: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8a50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8a60: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8a70: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8a80: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8a90: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8aa0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8ab0: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8ac0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8ad0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8ae0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
8af0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
8b00: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
8b10: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
8b20: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8b30: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
8b40: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8b50: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8b60: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8b70: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8b80: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8b90: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8ba0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8bb0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8bc0: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8bd0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8be0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8bf0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8c00: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8c10: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8c20: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8c30: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8c40: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8c50: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8c60: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8c70: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8c90: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8ca0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8cb0: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8cc0: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8cd0: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8ce0: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8cf0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8d00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8d10: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8d20: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8d30: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8d40: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8d50: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8d60: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8d70: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8d80: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8d90: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8db0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8dc0: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8dd0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8de0: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8df0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8e00: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8e10: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8e20: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8e30: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8e40: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8e50: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8e60: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8e70: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8e80: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8e90: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8ea0: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8eb0: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8ec0: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8ed0: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8ee0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8ef0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8f00: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8f10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8f30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8f40: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8f50: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8f60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8f70: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8fc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8fd0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8fe0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ff0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9000: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
9010: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9020: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
9030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
9040: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
9050: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
9060: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
9070: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
9080: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
9090: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
90a0: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
90b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
90c0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
90d0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
90e0: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
90f0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
9100: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
9110: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
9120: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9130: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9140: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9150: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9160: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9170: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9180: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9190: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
91a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
91b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
91c0: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
91d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
91e0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
91f0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
9200: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
9210: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9220: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
9230: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
9240: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9250: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9260: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9270: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9280: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9290: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
92a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
92b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
92c0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
92d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92e0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
92f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9300: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
9310: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9320: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
9330: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
9340: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9350: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9360: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9370: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9380: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9390: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
93a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
93b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
93c0: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
93d0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
93e0: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
93f0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9400: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9410: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9420: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9430: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9440: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9450: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9460: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9470: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9480: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9490: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
94a0: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
94b0: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
94c0: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
94d0: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
94e0: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
94f0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9500: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
9510: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
9520: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
9530: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
9540: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9550: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9560: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9570: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9580: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9590: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
95a0: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
95b0: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
95c0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
95d0: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
95e0: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
95f0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
9600: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
9610: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
9620: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
9630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9640: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9650: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9660: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9670: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9680: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9690: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
96a0: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
96b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
96c0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
96d0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
96e0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
96f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9700: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
9710: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
9720: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
9730: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
9740: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9750: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9760: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9770: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9780: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9790: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
97a0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
97b0: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
97c0: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
97d0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
97e0: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
97f0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
9800: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
9810: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
9820: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
9830: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
9840: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9850: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9860: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9870: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9880: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9890: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
98a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
98b0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
98c0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
98d0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98f0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9900: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9910: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9920: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9930: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9940: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9950: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9960: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9970: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9980: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9990: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
99a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
99b0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
99c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
99d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
99e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
99f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9a00: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9a10: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9a20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9a30: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
9a40: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9a50: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9a60: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9a70: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9a80: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9a90: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9aa0: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9ab0: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9ac0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9ad0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9ae0: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9af0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9b00: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9b10: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
9b20: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
9b30: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
9b40: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9b50: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9b60: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9b70: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9b80: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9b90: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9ba0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9bb0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9bc0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9bd0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9be0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9bf0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9c00: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9c10: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9c20: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9c30: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9c40: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9c50: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9c60: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9c70: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9c80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9c90: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9ca0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9cb0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9cc0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9cd0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9ce0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9cf0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9d00: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9d10: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9d20: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9d30: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9d40: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9d50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9d60: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9d70: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9d80: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9d90: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9da0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9db0: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9dd0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9de0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9df0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9e10: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9e20: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9e30: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9e40: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9e50: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9e60: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9e80: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9e90: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9ea0: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9eb0: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9ec0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9ed0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9ee0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9ef0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9f00: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9f10: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9f20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9f30: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9f40: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9f50: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9f60: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9f70: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9f80: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9f90: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9fa0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9fb0: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9fc0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9fd0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9fe0: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
a000: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
a010: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
a020: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
a030: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
a040: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
a050: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a060: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a070: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a080: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a090: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a0a0: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
a0b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
a0c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a0f0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
a100: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a130: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
a140: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a1a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a1b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a1c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a1d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a1e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a1f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a280: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a290: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a2a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a2b0: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a2c0: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a2d0: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a2e0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a2f0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a300: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a310: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a320: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a330: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a340: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a350: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a360: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a370: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a380: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a390: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a3a0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a3b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a3c0: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a3d0: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a3e0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a3f0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a400: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a410: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a420: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a430: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a440: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a450: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a460: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a470: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a480: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a490: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a4a0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a4b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a4c0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a4d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a4e0: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a4f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a500: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a510: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a520: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a530: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a540: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a550: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a560: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a570: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a580: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a590: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a5a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a5b0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a5c0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a5d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a5e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a5f0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a600: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a610: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a620: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a630: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a640: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a650: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a660: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a670: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a680: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a690: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a6a0: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a6b0: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a6c0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a6d0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a6e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a6f0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a700: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a710: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a720: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a730: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a740: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a750: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a760: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a780: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a790: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a7a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a7b0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a7c0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a7d0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a7e0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a7f0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a800: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a810: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a820: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a830: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a840: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a850: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a860: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a870: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a880: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a890: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a8a0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a8b0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a8c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a8d0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a8e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a8f0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a900: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a910: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a920: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a930: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a940: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a950: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a960: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a970: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a980: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a990: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a9a0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a9b0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a9c0: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a9d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a9e0: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a9f0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
aa00: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
aa10: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
aa20: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
aa30: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
aa40: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
aa50: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
aa60: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
aa70: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
aa80: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
aa90: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
aaa0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
aab0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
aac0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
aad0: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
aae0: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
aaf0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
ab00: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
ab10: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
ab20: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
ab30: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
ab40: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
ab50: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
ab60: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
ab70: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
ab80: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
ab90: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aba0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
abb0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
abc0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
abd0: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
abe0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
abf0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
ac00: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
ac10: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
ac20: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
ac30: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
ac40: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ac50: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ac60: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ac70: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ac80: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ac90: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
aca0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
acb0: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
acc0: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54  he page given. T
acd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72  his routine reor
ace0: 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69  ganizes cells wi
acf0: 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  thin the.** page
ad00: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61   so that there a
ad10: 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b  re no free-block
ad20: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c  s on the free-bl
ad30: 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ock list..**.** 
ad40: 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72  Parameter nMaxFr
ad50: 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ag is the maximu
ad60: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67  m amount of frag
ad70: 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61  mented space tha
ad80: 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73  t may be.** pres
ad90: 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  ent in the page 
ada0: 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  after this routi
adb0: 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ne returns..**.*
adc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
add0: 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c  -44582-60138 SQL
ade0: 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d  ite may from tim
adf0: 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61  e to time reorga
ae00: 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65  nize a.** b-tree
ae10: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
ae20: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62  ere are no freeb
ae30: 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e  locks or fragmen
ae40: 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20  t bytes, all.** 
ae50: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65  unused bytes are
ae60: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
ae70: 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70  e unallocated sp
ae80: 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20  ace region, and 
ae90: 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65  all.** cells are
aea0: 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20   packed tightly 
aeb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
aec0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
aed0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
aee0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
aef0: 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61  age, int nMaxFra
af00: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  g){.  int i;    
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
af30: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
af60: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
af70: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af90: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
afa0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
afb0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
afd0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
afe0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b000: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
b010: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
b020: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
b030: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
b040: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b050: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
b060: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
b070: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
b080: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b090: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b0a0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
b0b0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
b0c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b0d0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
b0e0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
b0f0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
b100: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
b110: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
b120: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
b130: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
b140: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
b150: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
b160: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
b170: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
b180: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
b190: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b1b0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b1c0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
b1d0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b1e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
b1f0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
b200: 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
b210: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b220: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b230: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b240: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b250: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b260: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
b270: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
b280: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b2a0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
b2b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b2c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b2d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b2e0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
b2f0: 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61   0;.  src = data
b300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b310: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b320: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
b330: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
b340: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
b350: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
b360: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
b370: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
b380: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
b390: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b3a0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b3b0: 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ell;.  usableSiz
b3c0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
b3d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f  usableSize;..  /
b3e0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  * This block han
b3f0: 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20  dles pages with 
b400: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65  two or fewer fre
b410: 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61  e blocks and nMa
b420: 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65  xFrag.  ** or fe
b430: 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62  wer fragmented b
b440: 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ytes. In this ca
b450: 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20  se it is faster 
b460: 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a  to move the.  **
b470: 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c   two (or one) bl
b480: 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73  ocks of cells us
b490: 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e  ing memmove() an
b4a0: 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72  d add the requir
b4b0: 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20  ed.  ** offsets 
b4c0: 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20  to each pointer 
b4d0: 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
b4e0: 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69  ter array than i
b4f0: 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65  t is to .  ** re
b500: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e  construct the en
b510: 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tire page.  */. 
b520: 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68   if( (int)data[h
b530: 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20  dr+7]<=nMaxFrag 
b540: 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65  ){.    int iFree
b550: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b560: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69  a[hdr+1]);.    i
b570: 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20  f( iFree ){.    
b580: 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67    int iFree2 = g
b590: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b5a0: 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ree]);..      /*
b5b0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20   pageFindSlot() 
b5c0: 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69  has already veri
b5d0: 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62  fied that free b
b5e0: 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64  locks are sorted
b5f0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64  .      ** in ord
b600: 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74  er of offset wit
b610: 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e  hin the page, an
b620: 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20  d that no block 
b630: 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a  extends.      **
b640: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b650: 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69   the page. Provi
b660: 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65  ded the two free
b670: 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20   slots do not . 
b680: 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c       ** overlap,
b690: 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   this guarantees
b6a0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76   that the memmov
b6b0: 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20  e() calls below 
b6c0: 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a  will not.      *
b6d0: 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  * overwrite the 
b6e0: 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20  usableSize byte 
b6f0: 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20  buffer, even if 
b700: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
b710: 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f  e.      ** is co
b720: 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrupt.  */.     
b730: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d   assert( iFree2=
b740: 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72  =0 || iFree2>iFr
b750: 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ee );.      asse
b760: 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79  rt( iFree+get2by
b770: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32  te(&data[iFree+2
b780: 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  ]) <= usableSize
b790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b7a0: 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69  ( iFree2==0 || i
b7b0: 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26  Free2+get2byte(&
b7c0: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20  data[iFree2+2]) 
b7d0: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
b7e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69  ..      if( 0==i
b7f0: 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69  Free2 || (data[i
b800: 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74  Free2]==0 && dat
b810: 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20  a[iFree2+1]==0) 
b820: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
b830: 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  End = &data[cell
b840: 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
b850: 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ];.        u8 *p
b860: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Addr;.        in
b870: 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20  t sz2 = 0;.     
b880: 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
b890: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
b8a0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  +2]);.        in
b8b0: 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65  t top = get2byte
b8c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
b8d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
b8e0: 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e2 ){.          
b8f0: 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72  if( iFree+sz>iFr
b900: 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ee2 ) return SQL
b910: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
b920: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
b930: 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67           sz2 = g
b940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b950: 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ree2+2]);.      
b960: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b970: 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d  e+sz+sz2+iFree2-
b980: 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73  (iFree+sz) <= us
b990: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
b9a0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
b9b0: 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32  ata[iFree+sz+sz2
b9c0: 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73  ], &data[iFree+s
b9d0: 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65  z], iFree2-(iFre
b9e0: 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  e+sz));.        
b9f0: 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20    sz += sz2;.   
ba00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
ba10: 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20  brk = top+sz;.  
ba20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62        assert( cb
ba30: 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c  rk+(iFree-top) <
ba40: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
ba50: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
ba60: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  &data[cbrk], &da
ba70: 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74  ta[top], iFree-t
ba80: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  op);.        for
ba90: 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c  (pAddr=&data[cel
baa0: 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c  lOffset]; pAddr<
bab0: 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b  pEnd; pAddr+=2){
bac0: 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
bad0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
bae0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
baf0: 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62  c<iFree ){ put2b
bb00: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
bb10: 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65  ); }.          e
bb20: 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65  lse if( pc<iFree
bb30: 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  2 ){ put2byte(pA
bb40: 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a  ddr, pc+sz2); }.
bb50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb60: 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e    goto defragmen
bb70: 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  t_out;.      }. 
bb80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b     }.  }..  cbrk
bb90: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
bba0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
bbb0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
bbc0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
bbd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
bbe0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
bbf0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
bc00: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
bc10: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
bc20: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
bc30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
bc40: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
bc50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
bc60: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
bc70: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bc80: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65   );.    /* These
bc90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
bca0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
bcb0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
bcc0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
bcd0: 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f   if PRAGMA cell_
bce0: 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20  size_check=ON.. 
bcf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
bd00: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bd10: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bd20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bd30: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
bd40: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
bd50: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
bd60: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
bd70: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
bd80: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
bd90: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
bda0: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
bdb0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
bdc0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
bdd0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bde0: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
bdf0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be10: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
be20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
be30: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
be40: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
be50: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
be60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
be70: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
be80: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
be90: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
bea0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
beb0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
bec0: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
bed0: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
bee0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
bef0: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
bf00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
bf10: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
bf20: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
bf30: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
bf40: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
bf50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf60: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
bf70: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
bf80: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
bf90: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
bfa0: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
bfb0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
bfc0: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
bfd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  ize);.  }.  data
bfe0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64  [hdr+7] = 0;.. d
bff0: 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20  efragment_out:. 
c000: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d   if( data[hdr+7]
c010: 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74  +cbrk-iCellFirst
c020: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
c030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c040: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
c050: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
c060: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
c070: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c080: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c090: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
c0a0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
c0b0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
c0c0: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
c0d0: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
c0e0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
c0f0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
c100: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
c110: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
c120: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
c130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
c150: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
c160: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
c170: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
c180: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
c190: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
c1a0: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
c1b0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
c1c0: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
c1d0: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
c1e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c1f0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
c200: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
c210: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
c220: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
c230: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
c240: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c250: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
c260: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
c270: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
c280: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
c290: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
c2a0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
c2b0: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
c2c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
c2d0: 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65  lots on the free
c2e0: 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62   list that are b
c2f0: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62  etween 1 and 3 b
c300: 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ytes larger than
c310: 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62   nByte.** will b
c320: 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64  e ignored if add
c330: 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70  ing the extra sp
c340: 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d  ace to the fragm
c350: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a  entation count.*
c360: 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61  * causes the fra
c370: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
c380: 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a   to exceed 60..*
c390: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
c3a0: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
c3b0: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
c3c0: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
c3d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
c3e0: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
c3f0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
c400: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
c410: 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68  .  int iAddr = h
c420: 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63  dr + 1;.  int pc
c430: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c440: 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e  ta[iAddr]);.  in
c450: 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  t x;.  int usabl
c460: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
c470: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
c480: 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b   assert( pc>0 );
c490: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73  .  do{.    int s
c4a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
c4b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c4c0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
c4d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c4e0: 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72  R-06866-39125 Fr
c4f0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77  eeblocks are alw
c500: 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e  ays connected in
c510: 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a   order of.    **
c520: 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73   increasing offs
c530: 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  et. */.    if( p
c540: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
c550: 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a  | pc<iAddr+4 ){.
c560: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
c570: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
c580: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  (pPg->pgno);.   
c590: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c5a0: 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
c5b0: 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35  CE-OF: R-22710-5
c5c0: 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61  3328 The third a
c5d0: 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20  nd fourth bytes 
c5e0: 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66  of each.    ** f
c5f0: 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20  reeblock form a 
c600: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c610: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c620: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  size of the free
c630: 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20  block.    ** in 
c640: 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67  bytes, including
c650: 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64   the 4-byte head
c660: 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20  er. */.    size 
c670: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c680: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66  a[pc+2]);.    if
c690: 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  ( (x = size - nB
c6a0: 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  yte)>=0 ){.     
c6b0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
c6c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c6d0: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
c6e0: 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63   if( pc < pPg->c
c6f0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d  ellOffset+2*pPg-
c700: 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70  >nCell || size+p
c710: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
c720: 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  {.        *pRc =
c730: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c740: 50 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b  PGNO(pPg->pgno);
c750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c760: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
c770: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
c780: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
c790: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
c7a0: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
c7b0: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
c7c0: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
c7d0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
c7e0: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
c7f0: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
c800: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
c810: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
c820: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
c830: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
c840: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
c850: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
c860: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
c870: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
c880: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
c890: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
c8a0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
c8b0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
c8c0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
c8d0: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
c8e0: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
c8f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c900: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
c910: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
c920: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
c930: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
c940: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
c950: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
c960: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
c970: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
c980: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
c990: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
c9a0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c9b0: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
c9c0: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
c9d0: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
c9e0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c9f0: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
ca00: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
ca10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ca20: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
ca30: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
ca40: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
ca50: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
ca60: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
ca70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
ca80: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
ca90: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
caa0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
cab0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
cac0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
cad0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
cae0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
caf0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
cb00: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
cb10: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
cb20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
cb30: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
cb40: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
cb50: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
cb60: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
cb70: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
cb80: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
cb90: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
cba0: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
cbb0: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
cbc0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
cbd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
cbe0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
cbf0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
cc00: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
cc10: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
cc20: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
cc30: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
cc40: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
cc50: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
cc60: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
cc70: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
cc80: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
cc90: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
cca0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
ccb0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
ccc0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ccd0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
cce0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
ccf0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
cd00: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
cd10: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
cd20: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
cd30: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
cd40: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
cd50: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
cd60: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
cd70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
cd80: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cdb0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
cdc0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
cdd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cde0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
cdf0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
ce00: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ce10: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
ce20: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ce30: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
ce40: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
ce50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
ce60: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
ce70: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ce80: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ce90: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
cea0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
ceb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cec0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ced0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
cee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
cef0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
cf00: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
cf10: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
cf20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
cf30: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
cf40: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
cf50: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
cf60: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
cf70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
cf80: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
cf90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cfa0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
cfb0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
cfc0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
cfd0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
cfe0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
cff0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d000: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
d010: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
d020: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
d030: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
d040: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
d050: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
d060: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
d070: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
d080: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
d090: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
d0a0: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
d0b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
d0c0: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
d0d0: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
d0e0: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
d0f0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
d100: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
d110: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
d120: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
d130: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
d140: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
d150: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
d160: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
d170: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d180: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
d190: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
d1a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1b0: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
d1c0: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
d1d0: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
d1e0: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
d1f0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
d200: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d210: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
d220: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
d230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d250: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
d260: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
d270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d280: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
d290: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
d2a0: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
d2b0: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
d2c0: 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74  r.  ** array ent
d2d0: 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69  ry offset, and i
d2e0: 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  f the freelist i
d2f0: 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65  s not empty, the
d300: 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a  n search the.  *
d310: 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  * freelist looki
d320: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
d330: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
d340: 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71   satisfy the req
d350: 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  uest..  */.  tes
d360: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
d370: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
d380: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
d390: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
d3a0: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61  top );.  if( (da
d3b0: 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74  ta[hdr+2] || dat
d3c0: 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70  a[hdr+1]) && gap
d3d0: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75  +2<=top ){.    u
d3e0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
d3f0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
d400: 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20  nByte, &rc);.   
d410: 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20   if( pSpace ){. 
d420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70       assert( pSp
d430: 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53  ace>=data && (pS
d440: 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35  pace - data)<655
d450: 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64  36 );.      *pId
d460: 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65  x = (int)(pSpace
d470: 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20   - data);.      
d480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d490: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d4b0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
d4c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
d4d0: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
d4e0: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
d4f0: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
d500: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
d510: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
d520: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
d530: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
d540: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
d550: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
d560: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
d570: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d580: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
d590: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
d5a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
d5b0: 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49  ntPage(pPage, MI
d5c0: 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65  N(4, pPage->nFre
d5d0: 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b  e - (2+nByte)));
d5e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d5f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
d600: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
d610: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
d620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
d630: 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  p+2+nByte<=top )
d640: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
d650: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
d660: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
d670: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
d680: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
d690: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
d6a0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
d6b0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d6c0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
d6d0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
d6e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
d6f0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
d700: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
d710: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
d720: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
d730: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
d740: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
d750: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
d760: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
d770: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
d780: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
d790: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
d7a0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
d7b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7c0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
d7d0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
d7e0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
d7f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
d800: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
d810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d820: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d830: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
d840: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
d850: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
d860: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
d870: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
d880: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
d890: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
d8a0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
d8b0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
d8c0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
d8d0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
d8e0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
d8f0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
d900: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
d910: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
d920: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
d930: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
d940: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
d950: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
d960: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
d970: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
d980: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
d990: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
d9a0: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
d9b0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
d9c0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
d9d0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
d9e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d9f0: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
da00: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
da10: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
da20: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
da30: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
da40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
da50: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
da60: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
da70: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
da80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
da90: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
daa0: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
dab0: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
dae0: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
daf0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
db00: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
db30: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
db40: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
db70: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
db80: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
db90: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
dbc0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
dbd0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
dbe0: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc00: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
dc10: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
dc20: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
dc30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
dc40: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
dc50: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
dc60: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
dc70: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
dc80: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
dc90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
dca0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
dcb0: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
dcc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
dcd0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
dce0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
dcf0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
dd00: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
dd10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
dd20: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
dd30: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
dd40: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
dd50: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
dd60: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
dd70: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
dd80: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
dd90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
dda0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
ddb0: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
ddc0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
ddd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dde0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ddf0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
de00: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
de10: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
de20: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
de30: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
de40: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
de50: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
de60: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
de70: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
de80: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
de90: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
dea0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
deb0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
dec0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
ded0: 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a  _FAST_SECURE ){.
dee0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
def0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
df00: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
df10: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
df20: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
df30: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
df40: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
df50: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
df60: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
df70: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
df80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
df90: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
dfa0: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
dfb0: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
dfc0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
dfd0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
dfe0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
dff0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
e000: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
e010: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
e020: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
e030: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
e040: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e050: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
e060: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
e070: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
e080: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
e090: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
e0a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e0b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e0c0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e0d0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
e0e0: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
e0f0: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
e100: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
e110: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) return SQ
e120: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e130: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e140: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
e150: 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72  eBlk>iPtr || iFr
e160: 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20  eeBlk==0 );.  . 
e170: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e180: 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69  int:.    **    i
e190: 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74  FreeBlk:   First
e1a0: 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72   freeblock after
e1b0: 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f   iStart, or zero
e1c0: 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20   if none.    ** 
e1d0: 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54     iPtr:       T
e1e0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20  he address of a 
e1f0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65  pointer to iFree
e200: 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  Blk.    **.    *
e210: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e220: 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c  f iFreeBlk shoul
e230: 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f  d be coalesced o
e240: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
e250: 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  Start..    */.  
e260: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26    if( iFreeBlk &
e270: 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42  & iEnd+3>=iFreeB
e280: 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61  lk ){.      nFra
e290: 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69  g = iFreeBlk - i
e2a0: 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  End;.      if( i
e2b0: 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72  End>iFreeBlk ) r
e2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e2d0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e2e0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45  >pgno);.      iE
e2f0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e300: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e310: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e320: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e330: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e340: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e360: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e370: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
e380: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e390: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e3a0: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e3b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e3c0: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e3d0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e3e0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e3f0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e400: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e410: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e420: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e430: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e440: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e450: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e460: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
e470: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
e480: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
e490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
e4a0: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
e4b0: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
e4c0: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
e4d0: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
e4e0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
e4f0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
e500: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
e510: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
e520: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e530: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
e540: 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  );.        nFrag
e550: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
e560: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
e570: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
e580: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
e590: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
e5a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e5b0: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
e5c0: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
e5d0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
e5e0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
e5f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
e600: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
e610: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
e620: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
e630: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
e640: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
e650: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
e660: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
e670: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
e680: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
e690: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e6a0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
e6b0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
e6c0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
e6d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
e6e0: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
e6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e700: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e710: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74  ->pgno);.    put
e720: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e730: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
e740: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e750: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
e760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e770: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
e780: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
e790: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
e7a0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e7b0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
e7c0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e7d0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
e7e0: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e7f0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e800: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
e810: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
e820: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
e830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e840: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
e850: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
e860: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
e870: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
e880: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
e890: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
e8a0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
e8b0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
e8c0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
e8d0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
e8e0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
e8f0: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
e900: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
e910: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
e920: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
e930: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
e940: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e950: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
e960: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
e970: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
e980: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e990: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e9a0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e9b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e9c0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e9d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e9e0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e9f0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
ea00: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
ea10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
ea20: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
ea30: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
ea40: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
ea50: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
ea60: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
ea70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ea80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ea90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
eaa0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
eab0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
eac0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
ead0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
eae0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
eaf0: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
eb00: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
eb10: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
eb20: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
eb30: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
eb40: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
eb50: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
eb60: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
eb70: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eb80: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
eb90: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eba0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
ebb0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
ebc0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
ebd0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
ebe0: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
ebf0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ec00: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
ec10: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
ec20: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
ec50: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
ec60: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
ec70: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
ec80: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
ec90: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
eca0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
ecb0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
ecc0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
ecd0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
ece0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ecf0: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
ed00: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
ed10: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
ed20: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
ed30: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
ed40: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
ed50: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
ed60: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
ed70: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
ed80: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ed90: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
eda0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
edb0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
edc0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
edd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ede0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
edf0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ee00: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ee10: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
ee20: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
ee30: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
ee40: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
ee50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
ee60: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
ee70: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
ee80: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
ee90: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
eea0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
eeb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
eec0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
eed0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
eee0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
eef0: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
ef00: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
ef10: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ef20: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
ef30: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ef40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ef50: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
ef60: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
ef70: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
ef80: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
ef90: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
efa0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
efb0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
efc0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
efd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
efe0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
eff0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
f000: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f010: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
f020: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
f030: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
f040: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
f050: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
f060: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
f070: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
f080: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
f090: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f0a0: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
f0b0: 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  o);.  }.  pPage-
f0c0: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
f0d0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
f0e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
f0f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f100: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
f110: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
f120: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
f130: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
f140: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
f150: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
f160: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
f170: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
f180: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
f190: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
f1a0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
f1b0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
f1c0: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
f1d0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
f1f0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
f200: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
f210: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
f220: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
f230: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
f240: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
f250: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
f260: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
f270: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
f280: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b  Page){.  int pc;
f290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f2a0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
f2b0: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
f2c0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
f2d0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
f2e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
f2f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
f300: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
f310: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
f320: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
f330: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
f340: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
f350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
f360: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
f370: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
f380: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
f390: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
f3a0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
f3b0: 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66   */.  u16 cellOf
f3c0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
f3d0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
f3e0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
f3f0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
f400: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
f410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f420: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
f430: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
f440: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
f450: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
f460: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
f470: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
f480: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
f490: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
f4a0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
f4b0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
f4c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
f4d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
f4e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
f4f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
f500: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f510: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
f520: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
f530: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
f540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f550: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f560: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f570: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f580: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
f590: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
f5a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
f5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f5c0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
f5d0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
f5e0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f5f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
f600: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
f610: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
f620: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
f630: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
f640: 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42  Init==0 );..  pB
f650: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f660: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
f670: 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
f680: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
f690: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
f6a0: 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30  F: R-28594-02890
f6b0: 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c   The one-byte fl
f6c0: 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69  ag at offset 0 i
f6d0: 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74  ndicating.  ** t
f6e0: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
f6f0: 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65  ype. */.  if( de
f700: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
f710: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20   data[hdr]) ){. 
f720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f730: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
f740: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
f750: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
f760: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
f770: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
f780: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
f790: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
f7a0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
f7b0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
f7c0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
f7d0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
f7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
f7f0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
f800: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
f810: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
f820: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
f830: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
f840: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
f850: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
f860: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
f870: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
f880: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
f890: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
f8a0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
f8b0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f8c0: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
f8d0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f8e0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
f8f0: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20  designates.  ** 
f900: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f910: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f920: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f930: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f940: 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70  r is.  ** interp
f950: 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
f960: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
f970: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
f980: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45  [hdr+5]);.  /* E
f990: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
f9a0: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
f9b0: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f9c0: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
f9d0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
f9e0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f9f0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67   page. */.  pPag
fa00: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
fa10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
fa20: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
fa30: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
fa40: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
fa50: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
fa60: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
fa70: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fa80: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
fa90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
faa0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fab0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65  >pgno);.  }.  te
fac0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
fad0: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
fae0: 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t) );.  /* EVIDE
faf0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
fb00: 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
fb10: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
fb20: 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
fb30: 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66  .  ** possible f
fb40: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
fb50: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
fb60: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
fb70: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   then the.  ** o
fb80: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
fb90: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77  l content area w
fba0: 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61  ill equal the pa
fbb0: 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  ge size minus th
fbc0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20  e.  ** bytes of 
fbd0: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
fbe0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
fbf0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74  ge->nCell>0 || t
fc00: 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  op==usableSize |
fc10: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
fc20: 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65  .  /* A malforme
fc30: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
fc40: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
fc50: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
fc60: 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  end.  ** of page
fc70: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
fc80: 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  cell.  .  **.  *
fc90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
fca0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
fcb0: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
fcc0: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
fcd0: 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68  nds.  ** past th
fce0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
fcf0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
fd00: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
fd10: 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72  PT to be .  ** r
fd20: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
fd30: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c  es..  */.  iCell
fd40: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
fd50: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
fd60: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
fd70: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
fd80: 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62  4;.  if( pBt->db
fd90: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
fda0: 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20  _CellSizeCk ){. 
fdb0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
fdc0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
fdd0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
fde0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
fdf0: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
fe00: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
fe10: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28  cell */..    if(
fe20: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
fe30: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
fe40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
fe50: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
fe60: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
fe70: 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61  yteAligned(&data
fe80: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
fe90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fea0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
feb0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
fec0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
fed0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
fee0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
fef0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
ff00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ff10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ff20: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
ff30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff40: 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
ff50: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
ff60: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74  ta[pc]);.      t
ff70: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
ff80: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
ff90: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
ffa0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
ffb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffc0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
ffd0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
ffe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fff0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
10000 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
10010 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75   }  ..  /* Compu
10020 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
10030 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
10040 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43  age.  ** EVIDENC
10050 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
10060 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
10070 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
10080 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
10090 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
100a0 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
100b0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
100c0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
100d0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72  e are no.  ** fr
100e0 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70  eeblocks. */.  p
100f0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
10100 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
10110 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
10120 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
10130 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
10140 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
10150 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e  ace */.  if( pc>
10160 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78  0 ){.    u32 nex
10170 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  t, size;.    if(
10180 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
101a0 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
101b0 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
101c0 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
101d0 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
101e0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
101f0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
10200 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
10210 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
10220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10240 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
10250 3e 70 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20  >pgno); .    }. 
10260 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
10270 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c       if( pc>iCel
10280 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
10290 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
102a0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
102b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
102c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
102d0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
102e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
102f0 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
10300 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10310 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
10320 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10330 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46  pc+2]);.      nF
10340 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
10350 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ze;.      if( ne
10360 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10370 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20  break;.      pc 
10380 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
10390 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a    if( next>0 ){.
103a0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
103b0 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64  ck not in ascend
103c0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
103d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
103e0 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
103f0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
10400 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10410 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10420 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10430 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
10440 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
10450 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
10460 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10470 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
10480 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
10490 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
104a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
104b0 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
104c0 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
104d0 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
104e0 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
104f0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
10500 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10510 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
10520 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d  n.  ** the cell-
10530 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
10540 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
10550 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
10560 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68  -size.  ** of th
10570 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
10580 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
10590 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
105a0 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65  eck also.  ** se
105b0 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
105c0 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
105d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
105e0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
105f0 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
10600 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
10610 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
10620 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
10630 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e   */.  if( nFree>
10640 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10660 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
10670 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
10680 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10690 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
106a0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61  ellFirst);.  pPa
106b0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
106c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
106e0 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
106f0 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
10700 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
10710 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
10720 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
10730 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
10740 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
10750 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
10760 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10770 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
10780 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
10790 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
107a0 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
107b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
107c0 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
107d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
107e0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
107f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
10800 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
10810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10820 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10830 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10840 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
10850 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10860 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10870 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10880 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
10890 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
108a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
108b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
108c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
108d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
108e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
108f0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
10900 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  & BTS_FAST_SECUR
10910 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
10920 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
10930 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10940 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
10950 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
10960 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
10970 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
10980 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
10990 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
109a0 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
109b0 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
109c0 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
109d0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
109e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
109f0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
10a00 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
10a10 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
10a20 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
10a30 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
10a40 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
10a50 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
10a60 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
10a70 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
10a80 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
10a90 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
10aa0 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
10ab0 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
10ac0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
10ad0 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50  ldPtrSize];.  pP
10ae0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10af0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
10b00 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
10b10 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
10b20 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
10b30 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
10b40 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10b50 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
10b60 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
10b70 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
10b80 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
10b90 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
10ba0 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
10bb0 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
10bc0 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
10bd0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
10be0 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
10bf0 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
10c00 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
10c10 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
10c20 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
10c30 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
10c40 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
10c50 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
10c60 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
10c70 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67    if( pgno!=pPag
10c80 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  e->pgno ){.    p
10c90 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
10ca0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10cb0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
10cc0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10cd0 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50   pDbPage;.    pP
10ce0 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10cf0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
10d00 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67  = pgno;.    pPag
10d10 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
10d20 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
10d30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10d40 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71  pPage->aData==sq
10d50 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10d60 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
10d70 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
10d80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10d90 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10da0 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
10db0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10dc0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10dd0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10de0 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
10df0 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
10e00 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
10e10 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
10e20 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
10e30 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
10e40 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
10e50 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
10e60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
10e70 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
10e80 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
10e90 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
10ea0 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
10eb0 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
10ec0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
10ed0 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
10ee0 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
10ef0 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
10f00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10f10 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
10f20 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
10f30 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
10f40 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
10f50 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
10f60 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
10f70 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
10f80 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
10f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10fa0 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10fb0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10fc0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10fd0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10ff0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11000 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
11010 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
11020 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
11030 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
11040 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
11050 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
11060 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
11070 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
11080 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
11090 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
110a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
110b0 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
110c0 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
110d0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
110e0 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
110f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
11100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11120 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11140 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
11150 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11160 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
11170 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
11180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
11190 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
111a0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
111b0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
111c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
111d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
111e0 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
111f0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
11200 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
11210 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
11220 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
11230 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
11240 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
11250 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
11260 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
11270 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
11280 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
11290 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
112a0 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
112b0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
112c0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
112d0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
112e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
112f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
11310 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
11320 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
11330 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
11340 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
11350 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
11360 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11370 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11380 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
11390 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
113a0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
113b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
113c0 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
113d0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
113e0 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
113f0 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
11400 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
11410 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
11420 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
11430 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
11440 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
11450 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
11460 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
11470 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
11480 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
11490 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
114a0 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
114b0 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d  ge)&0x8000000)==
114c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
114d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
114e0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
114f0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11500 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11510 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11520 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11530 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11540 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11550 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11560 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11570 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11580 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11590 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
115a0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
115b0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
115c0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
115d0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
115e0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
115f0 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11600 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11610 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11620 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11630 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11640 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11650 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11660 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11670 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11680 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11690 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
116a0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
116b0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
116c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
116d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
116e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11710 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11720 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11740 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11750 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11760 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11780 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11790 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
117a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
117b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
117c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
117d0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
117e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
117f0 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11810 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11820 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11840 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11860 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11870 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11880 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11890 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70  pPage==&pCur->ap
118a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
118b0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
118c0 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
118d0 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
118e0 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
118f0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11900 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
11910 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
11920 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
11930 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
11940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11950 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
11960 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11970 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
11980 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11990 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
119a0 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
119b0 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
119c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
119d0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
119e0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
119f0 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50   *ppPage = (MemP
11a00 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11a10 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11a20 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  e);.  if( (*ppPa
11a30 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
11a40 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46  {.    btreePageF
11a50 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
11a60 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
11a70 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
11a80 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
11a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11ab0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11ac0 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
11ad0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11ae0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
11af0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
11b00 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
11b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
11b20 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
11b30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11b40 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
11b50 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
11b60 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
11b70 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
11b80 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
11b90 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
11ba0 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
11bb0 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
11bc0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
11bd0 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
11be0 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
11bf0 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
11c00 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
11c10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c20 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e  CORRUPT_PGNO(pgn
11c30 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  o);.    releaseP
11c40 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11c50 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11c60 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11c70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11c80 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
11c90 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
11ca0 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
11cb0 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
11cc0 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
11cd0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
11ce0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
11cf0 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
11d00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11d10 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
11d20 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
11d30 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
11d40 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
11d50 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
11d60 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
11d70 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11d80 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
11d90 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
11da0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11dc0 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
11dd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
11de0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
11df0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11e00 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11e10 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11e20 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11e30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11e40 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11e50 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11e60 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
11e70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11e80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11e90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
11eb0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
11ec0 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
11ed0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11ee0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11ef0 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
11f00 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
11f10 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
11f20 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
11f30 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
11f40 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
11f50 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
11f60 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
11f70 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
11f80 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
11f90 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
11fa0 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
11fb0 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
11fc0 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
11fd0 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
11fe0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
11ff0 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
12000 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
12010 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
12020 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
12030 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
12040 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
12050 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
12060 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
12070 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12080 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12090 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
120a0 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
120b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
120c0 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
120d0 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
120e0 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
120f0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12100 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12110 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12120 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12130 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
12140 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
12150 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
12160 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
12170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12180 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12190 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
121a0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
121b0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
121c0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
121d0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
121e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
121f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12200 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12210 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12220 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12230 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
12240 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12250 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
12260 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
12270 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
12280 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
12290 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
122a0 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
122b0 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
122c0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
122d0 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
122e0 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
122f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12300 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12310 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12320 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12330 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12340 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
12350 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
12360 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
12370 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
12380 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
12390 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
123a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
123b0 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
123c0 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
123d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
123e0 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
123f0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12400 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12420 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12430 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
12440 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
12450 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12460 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12470 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12480 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
12490 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
124a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
124b0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
124c0 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
124d0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
124e0 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
124f0 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12500 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12510 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12520 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12530 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
12540 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
12550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
12560 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
12570 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
12580 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
12590 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
125a0 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
125b0 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
125c0 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
125d0 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
125e0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
125f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12600 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12610 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12620 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12630 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
12640 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
12650 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
12660 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
12670 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
12680 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12690 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
126a0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
126b0 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
126c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
126d0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
126e0 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
126f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12700 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12710 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12720 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12730 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12740 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
12750 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
12760 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
12770 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
12780 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
12790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
127a0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
127b0 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
127c0 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
127d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
127e0 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
127f0 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
12800 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
12810 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
12820 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
12830 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
12840 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
12850 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
12860 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
12870 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
12880 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
12890 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
128a0 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
128b0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
128c0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
128d0 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
128e0 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
128f0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
12900 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12910 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
12920 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12930 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
12940 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
12950 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
12960 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
12970 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
12980 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
12990 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
129a0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
129b0 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
129c0 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
129d0 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
129e0 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
129f0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
12a00 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
12a10 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12a30 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
12a40 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
12a50 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
12a60 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
12a70 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
12a80 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
12a90 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
12aa0 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
12ab0 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
12ac0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12ad0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
12ae0 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
12af0 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
12b00 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
12b10 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12b20 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
12b30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12b40 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12b50 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
12b60 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
12b70 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12b80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12b90 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
12ba0 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
12bb0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
12bc0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12bd0 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
12be0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12bf0 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
12c00 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
12c10 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
12c20 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
12c30 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
12c40 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12c50 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
12c60 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12c80 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12c90 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12ca0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12cb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12cc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12cd0 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
12ce0 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
12cf0 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
12d00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12d10 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
12d20 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
12d30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
12d40 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
12d50 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
12d60 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
12d70 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
12d80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12d90 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
12da0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
12db0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
12dc0 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
12dd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12de0 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
12df0 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
12e00 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
12e10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
12e20 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
12e30 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
12e40 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
12e50 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
12e60 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
12e70 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12e80 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
12e90 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
12ea0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
12eb0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
12ec0 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
12ed0 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
12ee0 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
12ef0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
12f00 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
12f10 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
12f20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
12f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12f40 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
12f50 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12f60 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
12f70 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12f80 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
12f90 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
12fa0 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
12fd0 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
12fe0 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
13010 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13020 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
13030 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
13040 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
13050 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
13060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13070 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
13080 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13090 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
130a0 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
130b0 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
130c0 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
130d0 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
130e0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
130f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
13100 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13110 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
13120 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
13130 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
13140 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
13150 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
13160 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
13170 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
13180 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
13190 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
131a0 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
131b0 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
131c0 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
131d0 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
131e0 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
131f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
13200 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13210 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
13220 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
13230 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
13240 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
13250 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
13260 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
13270 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
13280 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
13290 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
132a0 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
132b0 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
132c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
132d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
132e0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
132f0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13300 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13310 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13320 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13330 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
13340 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
13350 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
13360 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13370 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13380 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13390 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
133a0 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
133b0 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
133c0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
133d0 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
133e0 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
133f0 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13400 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13410 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13420 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13430 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
13440 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
13450 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
13460 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
13470 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
13480 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13490 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
134a0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
134b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
134c0 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
134d0 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
134e0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
134f0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13500 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13510 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13520 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13530 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
13540 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
13550 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13560 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13570 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
13580 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
13590 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
135a0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
135b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
135c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
135d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
135e0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
135f0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13600 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13610 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
13620 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
13630 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
13640 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13650 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
13660 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
13670 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
136a0 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
136b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
136c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
136d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
136e0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
136f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13700 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13730 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
13740 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
13750 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
13760 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
13770 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
13780 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
13790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
137a0 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
137b0 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
137c0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
137d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
137e0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
137f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13800 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13810 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
13820 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
13830 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13840 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13850 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
13860 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
13870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13880 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
13890 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
138a0 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
138b0 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
138c0 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
138d0 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
138e0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
138f0 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
13900 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
13910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13920 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
13930 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
13940 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
13950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
13960 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
13970 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
13980 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
13990 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
139a0 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
139b0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
139c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
139d0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
139e0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
139f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13a00 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13a10 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
13a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13a30 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
13a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13a50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
13a80 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
13a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13ab0 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13ac0 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13ad0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13af0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13b00 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13b10 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13b20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13b30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13b40 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
13b50 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
13b60 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
13b70 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
13b80 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
13b90 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
13ba0 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13bb0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13bc0 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13bd0 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13be0 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13bf0 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13c00 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13c10 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13c20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13c30 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13c40 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
13c50 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
13c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
13c70 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13c80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
13c90 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
13ca0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13cb0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13cc0 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13cd0 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13ce0 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13cf0 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13d00 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13d10 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13d20 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13d30 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13d40 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
13d50 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
13d60 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
13d70 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
13d80 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13d90 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
13da0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13db0 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13dc0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13dd0 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13de0 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13df0 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13e00 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13e10 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13e20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13e30 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13e40 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
13e50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
13e60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
13e70 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13e80 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13e90 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13ea0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
13eb0 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
13ec0 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13ef0 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
13f00 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13f10 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13f40 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13f50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13f60 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13f70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13f80 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
13f90 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
13fa0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
13fb0 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
13fc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13fe0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13ff0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
14000 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
14010 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
14020 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
14030 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
14040 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
14050 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
14060 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
14070 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
14080 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
14090 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
140a0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
140b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
140c0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
140d0 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
140e0 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
140f0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
14100 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  LY;.#if defined(
14110 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
14120 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62  LETE).    pBt->b
14130 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
14140 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65  ECURE_DELETE;.#e
14150 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
14160 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44  TE_FAST_SECURE_D
14170 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e  ELETE).    pBt->
14180 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14190 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69  OVERWRITE;.#endi
141a0 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
141b0 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
141c0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
141d0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
141e0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
141f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
14200 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
14210 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
14220 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
14230 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
14240 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
14250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14260 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
14270 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
14280 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
14290 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
142a0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
142b0 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
142c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
142d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
142e0 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
142f0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
14300 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
14310 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
14320 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
14330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14340 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14350 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
14360 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
14370 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
14380 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
14390 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
143a0 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
143b0 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
143c0 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
143d0 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
143e0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
143f0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
14400 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
14410 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
14420 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
14430 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
14440 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
14450 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
14460 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
14470 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
14480 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
14490 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
144a0 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
144b0 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
144c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
144d0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
144e0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
144f0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14500 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
14510 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
14520 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14530 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14540 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
14550 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
14560 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
14570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
14580 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
14590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
145a0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
145b0 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
145c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
145d0 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
145e0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
145f0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
14600 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
14610 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
14620 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
14630 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
14640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
14650 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
14660 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
14670 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
14680 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14690 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
146a0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
146b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
146c0 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
146d0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
146e0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
146f0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
14700 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
14710 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
14720 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
14730 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
14740 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
14750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14760 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
14770 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
14780 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
14790 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
147a0 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
147b0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
147c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
147d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
147e0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
147f0 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
14800 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
14810 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
14820 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
14830 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
14840 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14850 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14860 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14870 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
14880 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
14890 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
148a0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
148b0 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
148c0 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
148d0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
148e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
148f0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
14900 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
14910 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
14920 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
14930 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
14940 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14950 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14960 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14970 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14980 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14990 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
149a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
149b0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
149c0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
149d0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
149e0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
149f0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
14a00 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14a20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14a30 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
14a40 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14a50 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14a60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14a70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14a80 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14a90 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14aa0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14ab0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14ac0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14ad0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14ae0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14af0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14b10 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14b20 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14b30 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14b40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14b60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14b70 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14b80 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14b90 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14ba0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
14bb0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
14bc0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
14bd0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
14be0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
14bf0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14c10 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14c20 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14c30 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14c40 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14c50 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14c60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14c70 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14c90 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14ca0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
14cb0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
14cc0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
14cd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
14ce0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
14cf0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14d00 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14d10 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
14d20 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
14d30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14d40 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14d50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14d60 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14d70 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14d80 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14d90 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14da0 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14db0 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
14dc0 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
14dd0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14de0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
14df0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14e10 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14e20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14e30 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14e40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14e50 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14e60 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14e70 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e90 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14ea0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14ed0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
14ee0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
14ef0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f10 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14f20 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14f30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14f40 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
14f50 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
14f60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14f80 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
14f90 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
14fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
14fb0 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20  le *pFile;..    
14fc0 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
14fd0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14fe0 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
14ff0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
15000 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
15010 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
15020 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
15030 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
15040 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
15050 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
15060 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
15070 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
15080 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15090 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
150a0 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
150b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
150c0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
150d0 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
150e0 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
150f0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
15100 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20     }..    pFile 
15110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
15120 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
15130 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
15140 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
15150 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
15160 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
15170 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
15180 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d  DB, (void*)&pBt-
15190 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >db);.    }.  }.
151a0 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
151b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
151c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
151d0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
151e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
151f0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
15200 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
15210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15220 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  || sqlite3BtreeC
15230 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a  onnectionCount(*
15240 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20  ppBtree)>0 );.  
15250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15260 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
15270 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15280 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
15290 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
152a0 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
152b0 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
152c0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
152d0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
152e0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
152f0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15300 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
15310 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
15320 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
15330 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
15340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
15350 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15360 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
15370 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15380 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15390 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
153a0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
153b0 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
153c0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
153d0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
153e0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
153f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
15400 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15410 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
15420 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
15430 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15440 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15450 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
15460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15470 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
15480 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
15490 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
154a0 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
154b0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
154c0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
154d0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
154e0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
154f0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15500 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
15510 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
15520 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
15530 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15540 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15550 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
15560 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
15570 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
15580 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
15590 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
155a0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
155b0 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
155c0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
155d0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
155e0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
155f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15600 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
15610 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
15620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
15630 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
15640 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
15650 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
15660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15670 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
15680 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
15690 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
156a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
156b0 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
156c0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
156d0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
156e0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
156f0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
15700 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
15710 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
15720 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
15730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15740 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
15750 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15760 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
15770 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15780 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15790 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
157a0 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
157b0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
157c0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
157d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
157e0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
157f0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
15800 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
15810 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
15820 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
15830 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
15840 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
15850 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
15860 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
15870 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
15880 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
15890 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
158a0 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
158b0 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
158c0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
158d0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
158e0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
158f0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
15900 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
15910 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
15920 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
15930 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15940 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
15950 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
15960 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15970 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15980 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15990 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
159a0 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
159b0 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
159c0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
159d0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
159e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
159f0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
15a00 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
15a10 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
15a20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
15a30 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
15a40 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
15a50 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
15a60 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15a70 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15a80 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15a90 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
15aa0 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
15ab0 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
15ac0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
15ad0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
15ae0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
15af0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15b00 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15b10 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
15b20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
15b30 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
15b40 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
15b50 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
15b60 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15b70 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
15b80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
15b90 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
15ba0 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
15bb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
15bc0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
15bd0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15be0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15bf0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
15c00 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
15c10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
15c20 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
15c30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
15c40 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
15c50 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
15c60 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
15c70 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
15c80 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
15c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15ca0 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
15cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15cc0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
15cd0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
15ce0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
15cf0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
15d00 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
15d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15d20 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15d30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15d40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15d50 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
15d60 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
15d70 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
15d80 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
15d90 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
15da0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
15db0 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
15dc0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
15dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15de0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
15df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
15e00 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
15e10 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
15e20 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
15e30 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
15e40 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
15e50 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15e60 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
15e70 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
15e80 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
15e90 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
15ea0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15eb0 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
15ec0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
15ed0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
15ee0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
15ef0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
15f00 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
15f10 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
15f20 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
15f30 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
15f40 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
15f50 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
15f60 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
15f70 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
15f80 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
15f90 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15fa0 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
15fb0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
15fc0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
15fd0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15fe0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
15ff0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
16000 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
16010 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
16020 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
16030 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
16040 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
16050 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
16060 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
16070 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
16080 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
16090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
160a0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
160b0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
160c0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
160d0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a  pPager, p->db);.
160e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
160f0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
16100 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
16110 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
16120 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
16130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16140 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
16150 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
16160 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16170 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
16180 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
16190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
161a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
161b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
161c0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
161d0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
161e0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
161f0 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
16200 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16210 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
16220 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
16230 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
16240 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
16250 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
16260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16280 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
16290 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
162a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
162b0 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
162c0 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
162d0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
162e0 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
162f0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
16300 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16310 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
16320 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
16330 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
16340 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
16350 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
16360 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
16370 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
16380 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
16390 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
163a0 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
163b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
163c0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
163d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
163e0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
163f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16400 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16410 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16420 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16430 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16440 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16450 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16460 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16470 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16480 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
164a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
164b0 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
164c0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
164d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
164e0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
164f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16500 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
16510 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
16520 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16530 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
16540 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
16550 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
16560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
16570 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
16580 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
16590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
165a0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
165b0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
165c0 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
165d0 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
165e0 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
165f0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
16600 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
16610 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
16620 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
16630 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
16640 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
16650 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
16660 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16670 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
16680 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16690 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
166a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
166b0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
166c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
166d0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
166e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
166f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16700 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
16710 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
16720 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16730 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16740 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16750 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
16760 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
16770 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
16780 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
16790 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
167a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
167b0 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
167c0 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
167d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
167e0 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
167f0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
16800 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
16810 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16820 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16840 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16850 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16860 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16870 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16880 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
16890 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
168a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
168b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
168c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
168d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
168e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
168f0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
16900 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
16910 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
16920 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
16930 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
16940 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
16950 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
16960 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
16970 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
16980 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
16990 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
169a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
169b0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
169c0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
169d0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
169e0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
169f0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
16a00 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
16a10 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
16a20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
16a30 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
16a40 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
16a50 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
16a60 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
16a70 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
16a80 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
16a90 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
16aa0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
16ab0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16ac0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
16ad0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
16ae0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
16af0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
16b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16b10 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
16b20 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
16b30 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
16b40 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
16b50 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
16b60 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16b70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16b80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16b90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16ba0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16bb0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16bc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16bd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16be0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
16bf0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
16c00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16c10 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16c30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
16c40 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
16c50 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
16c60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16c70 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
16c80 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
16c90 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
16ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
16cb0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
16cc0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
16cd0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
16ce0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
16cf0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
16d00 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
16d10 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
16d20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
16d30 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
16d40 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
16d50 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
16d60 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
16d70 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16d80 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
16d90 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
16da0 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
16db0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
16dc0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
16dd0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
16de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
16df0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
16e00 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
16e10 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
16e20 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
16e30 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
16e40 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
16e50 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
16e60 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
16e70 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
16e80 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16e90 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
16ea0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
16eb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16ec0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
16ed0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
16ee0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
16ef0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
16f00 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
16f10 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
16f20 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
16f30 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
16f40 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
16f50 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
16f60 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
16f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16f80 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16f90 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
16fa0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16fb0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
16fc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16fd0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
16fe0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
17000 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
17010 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
17020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17030 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
17040 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17050 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17060 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17070 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17080 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
17090 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
170a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
170b0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
170c0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
170d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
170e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
170f0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
17100 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
17110 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
17120 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17130 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
17140 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17150 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17160 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17170 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
17180 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
17190 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
171a0 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
171b0 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
171c0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
171d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
171e0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
171f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
17200 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
17210 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17220 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
17230 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
17240 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17260 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17270 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17280 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
17290 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
172a0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
172b0 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
172c0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
172d0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
172e0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
172f0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
17300 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17320 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17330 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
17340 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17360 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17370 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
17380 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
17390 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
173a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
173b0 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
173c0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
173d0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
173e0 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
173f0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
17400 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17410 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
17420 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
17430 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
17440 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17450 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17460 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17470 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
17480 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
17490 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
174a0 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
174b0 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
174c0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
174d0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
174e0 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
174f0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
17500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17510 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
17520 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
17530 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
17540 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17550 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17560 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17570 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17580 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17590 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
175a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
175b0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
175c0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
175d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
175e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
175f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
17600 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
17610 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
17620 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
17630 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17640 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17650 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17660 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17670 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17680 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17690 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
176a0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
176b0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
176c0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
176d0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
176e0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
176f0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
17700 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
17710 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17720 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
17730 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
17740 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17750 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17760 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17770 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17780 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17790 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
177a0 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
177b0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
177c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
177d0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
177e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
177f0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17800 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17810 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17820 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17830 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17840 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17850 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17870 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17880 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17890 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
178a0 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
178b0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
178c0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
178d0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
178e0 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
178f0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17900 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17910 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17920 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17930 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17950 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17960 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17970 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17980 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17990 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
179a0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
179b0 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
179c0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
179d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
179e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
179f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n n;.}../*.** Ch
17a00 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73 20  ange the values 
17a10 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43 55  for the BTS_SECU
17a20 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
17a30 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67  S_OVERWRITE flag
17a40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46  s:.**.**    newF
17a50 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74  lag==0       Bot
17a60 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
17a70 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  ETE and BTS_OVER
17a80 57 52 49 54 45 20 61 72 65 20 63 6c 65 61 72 65  WRITE are cleare
17a90 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
17aa0 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =1       BTS_SEC
17ab0 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61  URE_DELETE set a
17ac0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
17ad0 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20   is cleared.**  
17ae0 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20    newFlag==2    
17af0 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45     BTS_SECURE_DE
17b00 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64  LETE cleared and
17b10 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
17b20 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46  s set.**    newF
17b30 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20  lag==(-1)    No 
17b40 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68  changes.**.** Th
17b50 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
17b60 61 73 20 61 20 71 75 65 72 79 20 69 66 20 6e 65  as a query if ne
17b70 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68  wFlag is less th
17b80 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69  an zero.**.** Wi
17b90 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  th BTS_OVERWRITE
17ba0 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f   set, deleted co
17bb0 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69  ntent is overwri
17bc0 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62  tten by zeros, b
17bd0 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  ut.** freelist l
17be0 65 61 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f  eaf pages are no
17bf0 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  t written back t
17c00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
17c10 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a   Thus in-page.**
17c20 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
17c30 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74   is cleared, but
17c40 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65   freelist delete
17c50 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  d content is not
17c60 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53  ..**.** With BTS
17c70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20  _SECURE_DELETE, 
17c80 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b  operation is lik
17c90 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  e BTS_OVERWRITE 
17ca0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
17cb0 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69  n.** that freeli
17cc0 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72  st leaf pages ar
17cd0 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  e written back i
17ce0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17cf0 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20  , increasing.** 
17d00 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69  the amount of di
17d10 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73  sk I/O..*/.int s
17d20 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
17d30 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
17d40 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17d50 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17d70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17d80 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
17d90 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d  ( BTS_OVERWRITE=
17da0 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  =BTS_SECURE_DELE
17db0 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74  TE*2 );.  assert
17dc0 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  ( BTS_FAST_SECUR
17dd0 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54  E==(BTS_OVERWRIT
17de0 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  E|BTS_SECURE_DEL
17df0 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  ETE) );.  if( ne
17e00 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
17e10 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17e20 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45   &= ~BTS_FAST_SE
17e30 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74  CURE;.    p->pBt
17e40 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17e50 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a  S_SECURE_DELETE*
17e60 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62  newFlag;.  }.  b
17e70 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
17e80 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
17e90 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55  SECURE)/BTS_SECU
17ea0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c  RE_DELETE;.  sql
17eb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17ec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
17ed0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17ee0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
17ef0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
17f00 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
17f10 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
17f20 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
17f30 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
17f40 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
17f50 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
17f60 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
17f70 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
17f80 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
17f90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
17fa0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
17fb0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
17fc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
17fd0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
17fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17ff0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
18000 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
18010 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
18020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18030 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
18050 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
18060 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18070 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
18080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
18090 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
180a0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
180b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
180c0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
180d0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
180e0 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
180f0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
18100 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
18110 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
18120 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
18130 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18140 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
18150 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
18160 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
18170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18180 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18190 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
181a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
181b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
181c0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
181d0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
181e0 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
181f0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
18200 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
18210 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
18220 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
18230 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
18240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
18250 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
18260 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
18270 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
18280 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
18290 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
182a0 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
182b0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
182c0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
182d0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
182e0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
182f0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
18300 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
18310 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
18320 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
18330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18340 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18350 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
18360 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
18370 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  has not set the 
18380 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72  safety-level for
18390 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
183a0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69  onnection.** usi
183b0 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  ng "PRAGMA synch
183c0 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20  ronous", and if 
183d0 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c  the safety-level
183e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
183f0 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  ** set to the va
18400 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  lue passed to th
18410 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74  is function as t
18420 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
18430 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73  ter,.** set it s
18440 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
18450 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
18460 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46  NOUS!=SQLITE_DEF
18470 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
18480 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64  NOUS.static void
18490 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
184a0 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42  lag(BtShared *pB
184b0 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76  t, u8 safety_lev
184c0 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el){.  sqlite3 *
184d0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  db;.  Db *pDb;. 
184e0 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62   if( (db=pBt->db
184f0 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d  )!=0 && (pDb=db-
18500 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  >aDb)!=0 ){.    
18510 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d  while( pDb->pBt=
18520 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e  =0 || pDb->pBt->
18530 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b  pBt!=pBt ){ pDb+
18540 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62  +; }.    if( pDb
18550 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20  ->bSyncSet==0 . 
18560 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65      && pDb->safe
18570 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79  ty_level!=safety
18580 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20  _level .     && 
18590 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d  pDb!=&db->aDb[1]
185a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70   .    ){.      p
185b0 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
185c0 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b   = safety_level;
185d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
185e0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
185f0 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
18600 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
18610 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
18620 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
18630 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  MASK));.    }.  
18640 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
18650 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  ne setDefaultSyn
18660 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79  cFlag(pBt,safety
18670 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a  _level).#endif..
18680 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
18690 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
186a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
186b0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
186c0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
186d0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
186e0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
186f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18700 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
18710 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
18720 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
18730 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
18740 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
18750 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
18760 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
18770 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
18780 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
18790 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
187a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
187b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
187c0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
187d0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
187e0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
187f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
18800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18810 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
18820 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
18830 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
18840 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
18850 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
18860 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18870 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
18880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18890 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
188a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
188b0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
188c0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
188d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
188e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
188f0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
18900 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
18910 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18920 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
18930 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
18940 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18950 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18960 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18970 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
18980 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
18990 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
189a0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
189b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
189c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
189d0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
189e0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
189f0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
18a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
18a20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
18a30 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
18a40 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
18a50 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
18a60 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
18a70 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
18a80 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
18a90 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
18aa0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
18ab0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
18ac0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18ad0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
18ae0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
18af0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
18b00 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
18b10 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
18b20 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
18b30 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
18b40 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
18b50 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
18b60 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
18b70 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
18b80 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
18b90 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
18ba0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
18bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18bc0 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
18bd0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
18be0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
18bf0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
18c00 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
18c10 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
18c20 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
18c30 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
18c40 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
18c50 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
18c60 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
18c70 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
18c80 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
18c90 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
18ca0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18cb0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18cc0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
18cd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
18ce0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
18cf0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
18d00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18d10 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
18d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
18d30 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
18d40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18d50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
18d60 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
18d70 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
18d80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
18d90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
18da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18db0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
18dc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18dd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18de0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
18df0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
18e00 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
18e10 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
18e20 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
18e30 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
18e40 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
18e50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
18e60 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
18e70 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
18e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
18e90 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18ea0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
18eb0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
18ec0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
18ed0 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
18ee0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
18ef0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
18f00 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
18f10 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
18f20 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
18f30 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
18f40 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
18f50 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
18f60 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
18f70 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
18f80 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
18f90 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
18fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18fb0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
18fc0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18fd0 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
18fe0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
18ff0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
19000 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19010 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
19020 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
19030 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19050 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19060 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
19070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19080 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
19090 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
190a0 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
190b0 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
190c0 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
190d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
190e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
190f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19120 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19130 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
19140 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
19150 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
19160 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
19170 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
19180 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
19190 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
191a0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
191b0 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
191c0 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
191d0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
191e0 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
191f0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19200 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19210 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19220 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19230 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
19240 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
19250 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
19260 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
19270 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
19280 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
19290 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
192a0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
192b0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
192c0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
192d0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
192e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
192f0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19300 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19310 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19320 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19330 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
19340 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
19350 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19360 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
19370 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
19380 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
19390 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
193a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
193b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
193c0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
193d0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
193e0 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
193f0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19400 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19410 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19420 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19430 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
19440 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
19450 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
19460 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
19470 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
19480 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
19490 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
194a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
194b0 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
194c0 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
194d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
194e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
194f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19500 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19510 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
19520 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
19530 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
19540 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
19550 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
19560 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
19570 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
19580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19590 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
195a0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
195b0 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
195c0 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
195d0 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
195e0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
195f0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
19600 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
19610 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
19620 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
19630 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
19640 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
19650 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
19660 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
19670 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
19680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19690 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
196a0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
196b0 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
196c0 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
196d0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
196e0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
196f0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
19700 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19710 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
19720 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
19730 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
19740 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
19750 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
19760 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
19770 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
19780 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
19790 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
197a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
197b0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
197c0 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
197d0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
197e0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
197f0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
19800 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
19810 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
19820 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
19830 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
19840 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19850 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
19860 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
19870 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
19880 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
19890 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
198a0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
198b0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
198c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
198d0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
198e0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
198f0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
19920 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
19930 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
19950 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
19960 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
19970 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  ma)==0 && nPage>
19980 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
19990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
199a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
199b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
199c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
199d0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
199e0 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
199f0 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19a00 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19a10 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19a20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19a30 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19a40 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19a50 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19a60 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
19a70 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
19a80 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
19a90 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
19aa0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
19ab0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19ac0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19ad0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19ae0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19af0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19b00 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19b10 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19b30 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19b40 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19b50 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19b60 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
19b70 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19b80 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
19b90 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
19ba0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
19bb0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19bc0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19bd0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19be0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19bf0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19c00 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19c10 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19c20 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19c30 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19c40 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19c50 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19c60 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19c70 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19c80 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19c90 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19ca0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19cb0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19cc0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19cd0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19ce0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19cf0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19d00 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19d10 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19d20 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19d30 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19d40 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19d50 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19d60 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19d70 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19d80 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19d90 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19da0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19db0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19dc0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19dd0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19de0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19df0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19e00 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19e10 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19e20 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19e30 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19e40 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19e50 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19e60 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19e70 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19e80 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19e90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ea0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19eb0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19ec0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19ed0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19ee0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19ef0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19f00 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19f10 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19f20 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19f30 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19f40 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19f50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19f60 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19f70 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19f80 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19f90 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19fa0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19fb0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19fd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19ff0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1a000 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1a010 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1a020 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1a030 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1a040 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1a050 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1a060 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1a070 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1a080 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1a090 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1a0a0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1a0b0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1a0c0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1a0d0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1a0e0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1a0f0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1a100 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1a110 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a120 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1a130 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1a140 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1a150 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1a160 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1a170 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1a180 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1a190 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1a1a0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1a1b0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a1c0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a1d0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a1e0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a1f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a200 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a210 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a220 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a230 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a240 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a250 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a260 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a270 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a280 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a290 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a2a0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a2b0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a2c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a2d0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a2e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a2f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a300 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a310 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a320 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a330 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a340 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a350 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a360 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a370 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a380 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a390 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a3a0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a3b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a3c0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a3d0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a3e0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a3f0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a400 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a410 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a420 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a430 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a440 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a450 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a460 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a480 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a490 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a4a0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a4b0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a4c0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a4d0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a4e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a4f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a500 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a510 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a520 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a530 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a550 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a570 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a580 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a590 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a5a0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a5b0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a5c0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a5d0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a5e0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a5f0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a600 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a610 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a620 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a630 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a640 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a650 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a670 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a680 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a690 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a6a0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a6b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a6c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a6d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a6e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a6f0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a710 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a720 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a730 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a740 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a750 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a760 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a770 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a780 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a790 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a7a0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a7b0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a7c0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a7d0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a7e0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a7f0 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a800 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a810 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a820 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a830 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a840 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a850 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a860 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a870 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a880 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a890 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a8a0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a8b0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a8c0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a8d0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a8e0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a8f0 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a900 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a910 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a920 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a930 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a940 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a950 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a960 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a970 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a980 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a990 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a9a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a9b0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a9c0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a9d0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a9e0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a9f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1aa00 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1aa10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1aa20 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1aa30 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1aa40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1aa50 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1aa60 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1aa70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1aa80 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1aa90 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1aaa0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1aab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1aac0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1aad0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1aae0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aaf0 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1ab00 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1ab10 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1ab20 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1ab30 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1ab40 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1ab50 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1ab60 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1ab70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1ab80 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1ab90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1aba0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1abb0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1abc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1abd0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1abe0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1abf0 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1ac00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ac10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1ac20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1ac30 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1ac40 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1ac50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ac60 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1ac70 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1ac80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1ac90 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1aca0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1acb0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1acc0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1acd0 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ace0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1acf0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ad00 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ad10 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ad20 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1ad30 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1ad40 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1ad50 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1ad60 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1ad70 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1ad80 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1ad90 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1ada0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1adb0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1adc0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1add0 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1ade0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1adf0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ae00 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1ae10 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1ae20 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1ae30 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1ae40 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1ae50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1ae60 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1ae70 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1ae80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1ae90 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1aea0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1aeb0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1aec0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1aed0 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1aee0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1aef0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1af00 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1af10 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1af20 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1af30 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1af40 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1af50 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1af60 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1af70 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1af80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1af90 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1afa0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1afb0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1afc0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1afd0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1afe0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1aff0 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1b000 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1b010 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1b020 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1b030 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1b040 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1b050 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1b060 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1b070 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1b080 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1b090 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1b0a0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1b0b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1b0c0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1b0d0 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1b0e0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1b0f0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1b100 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1b110 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1b120 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1b130 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1b140 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1b150 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1b160 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1b170 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1b180 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1b190 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1b1a0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1b1b0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b1c0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b1d0 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b1e0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b1f0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b200 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b210 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b220 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b230 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b240 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b250 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b260 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b270 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b280 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b290 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b2a0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b2b0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b2c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b2d0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b2e0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b2f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b300 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1b310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b320 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1b330 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1b340 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1b350 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1b360 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1b370 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1b380 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1b390 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1b3a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1b3b0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1b3c0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1b3d0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1b3e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b3f0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b400 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1b410 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1b420 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1b430 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1b440 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b450 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1b460 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b470 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1b480 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1b490 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1b4a0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1b4b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b4c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1b4d0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1b4e0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b4f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b500 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b510 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b530 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b540 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b550 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b560 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b570 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b580 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b590 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b5a0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b5b0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b5c0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b5d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b5e0 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b5f0 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b600 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b610 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b620 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b630 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b640 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b650 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b660 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b670 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b680 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b690 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b6a0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b6b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b6c0 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b6d0 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b6e0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b6f0 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b700 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b710 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b720 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b730 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b740 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b750 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b760 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b770 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b780 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b790 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b7b0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b7d0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b7e0 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b7f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b800 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b810 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b820 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b830 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b840 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b850 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b860 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b870 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b880 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b890 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1b8a0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1b8b0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1b8c0 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1b8d0 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1b8e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b8f0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1b900 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1b910 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1b920 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1b930 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1b940 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1b950 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1b960 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1b970 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b980 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b990 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1b9a0 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1b9b0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1b9c0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b9d0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1b9e0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1b9f0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1ba00 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1ba10 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1ba20 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1ba30 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1ba40 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1ba50 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1ba60 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1ba70 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1ba80 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1ba90 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1baa0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1bab0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1bac0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1bad0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1bae0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1baf0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1bb00 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1bb10 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1bb20 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1bb30 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1bb40 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1bb50 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1bb60 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1bb70 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1bb80 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1bb90 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1bba0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1bbb0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1bbc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1bbd0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1bbe0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1bbf0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1bc00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1bc10 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1bc20 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1bc30 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1bc40 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1bc50 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1bc60 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1bc70 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1bc80 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1bc90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bca0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bcb0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1bcc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bcd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1bce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bcf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1bd00 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1bd10 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1bd20 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1bd30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1bd40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bd50 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1bd60 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1bd70 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1bd80 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1bd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bda0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1bdb0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1bdc0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1bdd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1bde0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bdf0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1be00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1be10 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1be20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1be30 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1be40 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1be50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1be60 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1be70 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1be80 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1be90 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1bea0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1beb0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1bec0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1bed0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1bee0 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1bef0 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1bf00 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1bf10 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1bf20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1bf30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bf40 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1bf50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1bf60 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1bf70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1bf80 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1bf90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bfa0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bfb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1bfc0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1bfd0 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1bfe0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1bff0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c000 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1c010 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1c020 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1c030 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1c040 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1c050 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1c060 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1c070 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1c080 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1c090 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1c0a0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1c0b0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1c0c0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1c0d0 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1c0e0 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1c0f0 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1c100 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1c110 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1c120 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1c130 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1c140 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1c150 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1c160 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1c170 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1c180 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1c190 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1c1a0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1c1b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1c1c0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1c1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1c1e0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1c1f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c200 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1c210 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1c220 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c240 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c250 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1c260 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1c270 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c280 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1c290 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1c2a0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c2b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1c2c0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1c2d0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1c2e0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1c2f0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1c300 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1c310 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1c320 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1c330 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1c340 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1c350 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1c360 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1c370 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1c380 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1c390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c3a0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1c3b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1c3c0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c3d0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c3e0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1c3f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c400 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c410 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1c420 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c430 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1c440 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1c450 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1c460 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1c470 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1c480 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1c490 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1c4a0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c4b0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1c4c0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1c4d0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1c4e0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c4f0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c500 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c510 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c520 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c550 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c560 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c590 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c5a0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c5b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c5d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c5e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c5f0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c600 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c610 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c620 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c630 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c650 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1c660 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1c670 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1c680 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1c690 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1c6a0 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1c6b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1c6c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1c6d0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1c6e0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1c6f0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1c700 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1c710 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1c720 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1c730 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c740 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1c750 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c760 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1c770 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1c780 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1c790 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1c7a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c7b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1c7c0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1c7d0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1c7e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1c7f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1c800 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1c810 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1c820 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1c830 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1c840 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c850 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1c860 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1c870 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1c880 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1c890 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1c8a0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1c8b0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1c8c0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1c8d0 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1c8e0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1c8f0 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1c900 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1c910 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1c920 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1c930 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1c940 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1c950 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1c960 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1c970 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1c980 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c990 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1c9a0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1c9b0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1c9c0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1c9f0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1ca00 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1ca10 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1ca20 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1ca30 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1ca40 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1ca50 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1ca60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ca70 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1ca80 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1ca90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1caa0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1cab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1cac0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1cad0 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1cae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1caf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1cb00 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1cb10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cb20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1cb30 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1cb40 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1cb50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1cb60 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1cb70 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1cb80 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1cb90 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1cba0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1cbb0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1cbc0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1cbd0 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1cbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cbf0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
1cc00 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
1cc10 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cc20 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cc30 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cc40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1cc50 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1cc60 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1cc70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1cc80 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1cc90 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1cca0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ccb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1ccc0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1ccd0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1cce0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1ccf0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1cd00 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1cd10 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1cd20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1cd30 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1cd40 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1cd50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1cd60 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1cd70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1cd80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1cd90 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1cda0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1cdb0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1cdc0 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1cdd0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1cde0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1cdf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1ce00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ce10 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
1ce20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1ce30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1ce40 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1ce50 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1ce60 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1ce70 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1ce80 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1ce90 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1cea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ceb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1cec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ced0 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1cee0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1cef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1cf00 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1cf10 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1cf20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1cf30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1cf40 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1cf50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1cf60 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1cf70 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1cf80 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1cf90 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1cfa0 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1cfb0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1cfc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1cfd0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
1cfe0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
1cff0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d000 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d010 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d020 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1d030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d040 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1d050 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1d060 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d070 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1d080 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1d090 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1d0a0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1d0b0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1d0c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1d0d0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1d0e0 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1d0f0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1d100 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1d110 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1d120 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1d130 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1d140 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1d150 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1d160 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1d170 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1d180 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1d190 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1d1a0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1d1b0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1d1c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1d1d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1d1e0 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1d1f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1d200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1d210 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1d220 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1d230 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d240 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1d250 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d260 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1d270 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1d280 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1d290 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1d2a0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1d2b0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1d2c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1d2d0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1d2e0 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1d2f0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1d300 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1d310 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1d320 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1d330 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1d340 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1d350 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1d360 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1d370 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1d380 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1d390 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1d3a0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1d3b0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1d3c0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1d3d0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1d3e0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1d3f0 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1d400 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1d410 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1d420 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1d430 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1d440 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1d450 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d460 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d470 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d480 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1d490 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1d4a0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1d4b0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1d4c0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1d4d0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1d4e0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1d4f0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1d500 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1d510 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1d520 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1d530 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1d540 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1d550 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1d560 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1d570 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1d580 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1d590 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1d5a0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1d5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d5d0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1d5e0 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1d5f0 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1d600 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1d610 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1d620 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1d630 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1d640 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1d650 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1d660 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1d670 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1d680 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1d690 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1d6a0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1d6b0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1d6c0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1d6d0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1d6e0 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1d6f0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1d700 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1d710 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1d720 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1d730 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1d740 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1d750 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1d760 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1d770 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1d780 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1d790 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d7a0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d7b0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d7c0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1d7d0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1d7e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d7f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d800 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1d820 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1d830 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1d840 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1d850 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1d860 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1d870 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1d880 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1d890 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1d8a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d8c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d8d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d8e0 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1d8f0 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1d900 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1d910 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1d920 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1d930 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1d940 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1d950 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1d960 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1d970 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1d980 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1d990 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d9a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1d9b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1d9c0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1d9d0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1d9e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1da00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1da10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1da20 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1da30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1da40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1da60 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1da70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1da80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1da90 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1daa0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1dab0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1dac0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1dad0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1dae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1daf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1db00 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1db10 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1db20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1db30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1db40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1db50 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1db60 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1db70 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1db80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1db90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1dba0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1dbb0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1dbc0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1dbd0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1dbe0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1dbf0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1dc00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1dc10 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1dc20 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1dc30 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1dc40 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1dc50 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1dc60 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1dc70 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1dc80 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1dc90 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1dca0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1dcb0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1dcc0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1dcd0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1dce0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1dcf0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1dd00 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1dd10 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1dd20 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1dd30 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1dd40 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1dd50 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1dd60 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1dd70 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1dd80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1dd90 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1dda0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1ddb0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1ddc0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1ddd0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1dde0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1ddf0 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1de00 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1de10 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1de20 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1de30 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1de40 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1de50 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1de60 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1de70 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1de80 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1de90 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1dea0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1deb0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1dec0 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ded0 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1dee0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1def0 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1df00 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1df10 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1df20 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1df30 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1df40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1df50 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1df60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1df70 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1df80 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1df90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1dfa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dfb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1dfc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1dfd0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1dfe0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1dff0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e000 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1e010 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1e020 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e030 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1e040 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1e050 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1e060 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e070 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e080 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1e090 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1e0a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e0b0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1e0c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e0d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1e0e0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1e0f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e120 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1e130 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e150 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e160 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e170 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e180 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1e190 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1e1a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1e1b0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1e1c0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1e1d0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1e1e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1e1f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1e200 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1e210 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1e220 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1e230 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1e240 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1e250 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1e260 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1e270 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1e280 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1e290 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1e2a0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1e2b0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1e2c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e2d0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1e2e0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e2f0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1e300 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1e310 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1e320 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1e330 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1e340 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1e350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1e390 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1e3a0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1e3b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e3c0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1e3d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1e3e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e400 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1e410 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1e420 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1e430 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1e440 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1e450 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1e460 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1e470 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e480 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1e490 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1e4a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e4b0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1e4c0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1e4d0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1e4e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1e4f0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1e500 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1e510 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e540 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e550 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1e560 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1e570 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1e580 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1e590 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1e5a0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1e5b0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1e5c0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1e5d0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1e5e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1e5f0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1e600 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1e610 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1e620 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1e630 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1e640 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1e650 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1e660 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1e670 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1e680 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1e690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e6a0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1e6b0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1e6c0 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1e6d0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1e6e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1e6f0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1e700 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e710 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e720 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e730 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e740 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1e750 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1e760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1e780 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1e790 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1e7a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1e7b0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1e7c0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1e7d0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1e7e0 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1e7f0 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1e800 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1e810 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1e820 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1e830 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1e840 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1e850 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1e860 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1e870 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1e880 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1e890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e8a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e8b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e8c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1e8d0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1e8e0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1e8f0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1e900 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1e910 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e920 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1e930 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1e940 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1e950 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1e960 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1e970 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1e980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1e9a0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1e9b0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1e9c0 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1e9d0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1e9e0 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1e9f0 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1ea00 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1ea10 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1ea20 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1ea30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ea40 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1ea50 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1ea60 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1ea70 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1ea80 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1ea90 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1eaa0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1eab0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1eae0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1eaf0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1eb00 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1eb30 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1eb40 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1eb50 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1eb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1eb70 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1eb80 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1eb90 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1eba0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1ebb0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1ebc0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1ebd0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1ebe0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1ebf0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1ec00 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1ec10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ec20 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1ec30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ec40 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1ec50 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1ec60 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1ec70 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1ec80 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ec90 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1eca0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1ecb0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1ecc0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1ecd0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ece0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1ecf0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ed00 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1ed10 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1ed20 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1ed30 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1ed40 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1ed50 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1ed60 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1ed70 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1ed80 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1ed90 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1eda0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1edb0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1edc0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1edd0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1ede0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1edf0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1ee00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ee10 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1ee20 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1ee30 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1ee40 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1ee50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ee60 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1ee70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1ee80 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1ee90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1eea0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1eeb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1eec0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1eed0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1eee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1eef0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1ef00 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1ef10 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1ef20 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1ef30 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1ef40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ef50 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1ef60 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1ef70 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1ef80 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1ef90 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1efa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1efb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1efc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1efd0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1efe0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1eff0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1f000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f020 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f030 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1f040 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1f050 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1f060 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1f070 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f0a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f0b0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f0c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f0d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f0e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f0f0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f100 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f120 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f130 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1f140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f170 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1f180 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1f190 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1f1a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1f1b0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1f1c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1f1d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1f1e0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1f1f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1f200 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1f210 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1f220 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1f230 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1f240 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1f250 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1f260 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1f270 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1f280 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1f290 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1f2a0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1f2b0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1f2c0 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1f2d0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1f2e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1f2f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1f300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f310 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1f320 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1f330 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1f340 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1f350 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f360 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1f370 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f380 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1f390 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1f3a0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f3b0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1f3c0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1f3d0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1f3e0 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1f3f0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1f400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f410 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1f420 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1f430 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1f440 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1f450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f460 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1f470 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1f480 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1f490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f4a0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1f4b0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1f4c0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1f4d0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1f4e0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1f4f0 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1f500 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f510 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1f520 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1f530 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1f540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f550 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f560 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1f570 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1f580 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1f590 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1f5a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1f5b0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1f5c0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1f5d0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1f5e0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1f5f0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1f600 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1f610 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1f620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1f630 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f640 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1f650 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1f660 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f670 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1f680 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1f690 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1f6a0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1f6b0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1f6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f6d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f6e0 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1f6f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1f700 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1f710 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1f720 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1f730 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1f740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1f750 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1f760 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f770 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1f780 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1f790 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1f7a0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1f7b0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1f7c0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1f7d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f7e0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f7f0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f800 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1f810 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f820 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1f830 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1f840 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1f850 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1f860 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f870 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1f880 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1f890 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1f8a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1f8b0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1f8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f8e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1f8f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1f900 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1f910 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1f920 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1f930 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1f940 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1f950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1f970 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1f980 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1f990 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1f9a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f9b0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1f9c0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1f9d0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1f9e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1f9f0 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1fa00 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1fa10 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1fa20 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1fa30 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1fa40 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1fa50 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1fa60 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1fa70 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1fa80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1fa90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1faa0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1fab0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1fac0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1fad0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1fae0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1faf0 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1fb00 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1fb10 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1fb20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1fb30 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1fb40 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1fb50 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1fb60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fb70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1fb80 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1fb90 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1fba0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1fbb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1fbc0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1fbd0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1fbe0 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1fbf0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1fc00 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1fc10 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1fc20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1fc30 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1fc40 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fc50 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1fc60 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1fc70 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1fc80 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1fc90 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1fca0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1fcb0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1fcc0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1fcd0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1fce0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1fcf0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1fd00 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1fd10 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1fd20 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1fd30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fd40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1fd50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd60 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1fd70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1fd80 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1fd90 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1fda0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1fdb0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1fdc0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1fdd0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1fde0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1fdf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1fe00 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1fe10 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1fe20 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1fe30 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1fe40 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1fe50 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1fe60 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1fe70 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1fe80 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1fe90 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1fea0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1feb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1fec0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1fed0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1fee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1fef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ff00 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ff10 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1ff20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1ff30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ff40 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1ff50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1ff60 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1ff70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ff80 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1ff90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ffc0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1ffd0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1ffe0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1fff0 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20020 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20030 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20040 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20050 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20060 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20070 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20080 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20090 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
200a0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
200b0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
200c0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
200d0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
200e0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
200f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20100 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20110 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20120 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20130 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20140 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20150 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20160 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20170 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
20180 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
20190 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
201a0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
201b0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
201c0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
201d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
201e0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
201f0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20200 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20210 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20220 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20230 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20240 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
20250 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
20260 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20270 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
20280 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
20290 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
202a0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
202b0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
202c0 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
202d0 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
202e0 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
202f0 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20300 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20310 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20320 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20330 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
20340 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20350 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
20360 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
20370 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
20380 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
20390 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
203a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
203b0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
203c0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
203d0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
203e0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
203f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20400 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20410 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20430 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
20440 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
20450 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
20460 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
20470 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
20480 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
20490 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
204a0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
204b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
204c0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
204d0 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
204e0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
204f0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
20500 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
20510 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
20520 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
20530 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
20540 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
20550 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
20560 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20570 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
20580 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
20590 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
205a0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
205b0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
205c0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
205d0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
205e0 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
205f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
20600 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
20610 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20620 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20630 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
20640 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
20650 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
20660 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
20670 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
20680 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
206a0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
206b0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
206c0 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
206d0 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
206e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
206f0 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
20700 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20710 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
20720 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
20730 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
20740 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
20750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20760 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
20770 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
20780 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
20790 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
207a0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
207b0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
207c0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
207d0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
207e0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
207f0 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
20800 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
20810 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
20820 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
20830 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
20840 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
20850 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20860 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
20870 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
20880 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
20890 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
208a0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
208b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
208c0 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
208d0 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
208e0 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
208f0 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
20900 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
20910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
20920 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
20930 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
20940 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
20950 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
20960 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
20970 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
20980 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
20990 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
209a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
209b0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
209c0 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
209d0 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
209e0 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
209f0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
20a00 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
20a10 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
20a20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20a30 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
20a40 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
20a50 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
20a60 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
20a70 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
20a80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
20a90 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
20aa0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
20ab0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
20ac0 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
20ad0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20ae0 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
20af0 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
20b00 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
20b10 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
20b20 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
20b30 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
20b40 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
20b50 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
20b60 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20b70 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20b90 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20ba0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20bb0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20bc0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20bd0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20be0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20bf0 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
20c00 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
20c10 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
20c20 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
20c30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20c40 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
20c50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
20c60 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20c70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
20c80 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
20c90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
20ca0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
20cb0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
20cc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
20cd0 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
20ce0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
20cf0 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
20d00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20d10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
20d20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
20d30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20d40 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
20d50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20d60 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
20d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20d80 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20d90 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
20da0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20db0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
20dc0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
20de0 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
20df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20e00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
20e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20e20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
20e30 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
20e40 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
20e50 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
20e60 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
20e70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20e80 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20e90 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20ea0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20eb0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20ec0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20ed0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20ef0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20f00 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
20f10 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
20f20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
20f30 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
20f40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
20f50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20f60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
20f70 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20f80 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
20f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20fa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20fb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20fc0 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
20fd0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
20fe0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20ff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21010 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21020 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21030 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21040 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21050 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21060 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21070 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21080 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21090 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
210a0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
210b0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
210c0 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
210d0 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
210e0 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
210f0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21100 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21110 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21120 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21130 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21140 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21150 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21160 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21170 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
21180 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
21190 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
211a0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
211b0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
211c0 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
211d0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
211e0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
211f0 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21200 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21210 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21220 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21230 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
21240 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
21250 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
21260 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
21270 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
21280 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
21290 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
212a0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
212b0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
212c0 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
212d0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
212e0 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
212f0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21300 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21310 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21320 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21330 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
21340 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
21350 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
21360 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
21370 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
21380 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
21390 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
213a0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
213b0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
213c0 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
213d0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
213e0 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
213f0 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21400 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21410 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21420 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21430 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
21440 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
21450 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
21460 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21470 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
21480 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
21490 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
214a0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
214b0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
214c0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
214d0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
214e0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
214f0 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
21500 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
21510 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21520 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
21530 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
21540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
21550 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
21560 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
21570 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
21580 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
21590 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
215a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
215b0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
215c0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
215d0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
215e0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
215f0 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21600 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21610 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21620 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21630 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
21640 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
21650 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21660 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
21670 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
21680 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
21690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
216a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
216b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
216c0 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
216d0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
216e0 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
216f0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21730 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
21740 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
21750 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
21760 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
21770 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
21780 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
21790 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
217a0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
217b0 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
217c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
217d0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
217e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
217f0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21810 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21820 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21830 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
21840 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
21850 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
21860 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
21870 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
21880 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
21890 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
218a0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
218b0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
218c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
218d0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
218e0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
218f0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21900 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21910 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21920 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21930 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21940 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21950 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21960 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21970 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
21980 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
21990 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
219a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
219b0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
219c0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
219d0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
219e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
219f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21a00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21a10 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21a20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21a30 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21a40 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21a50 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21a60 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21a70 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
21a80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
21a90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
21aa0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
21ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
21ac0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
21ad0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
21ae0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
21af0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21b00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21b20 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21b30 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21b40 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21b50 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21b60 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21b70 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
21b80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21b90 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
21ba0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
21bb0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
21bc0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
21bd0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
21be0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21bf0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21c00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21c10 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21c20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21c30 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21c40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21c50 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21c60 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21c70 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
21c80 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
21c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21ca0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
21cb0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
21cc0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
21cd0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
21ce0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
21cf0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21d00 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21d10 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21d20 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21d30 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21d40 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21d50 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21d60 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21d70 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
21d80 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
21d90 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
21da0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
21db0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
21dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21dd0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
21de0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21df0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21e00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21e10 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21e30 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21e40 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21e50 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21e70 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21e80 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21e90 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
21ea0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
21eb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21ec0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
21ed0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
21ee0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
21ef0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21f00 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21f20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21f40 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21f50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21f60 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21f70 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21f80 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21f90 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21fa0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21fb0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21fd0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
21fe0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
21ff0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22000 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
22010 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
22020 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
22030 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
22040 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
22050 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
22060 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
22070 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
22080 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
22090 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
220a0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
220b0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
220c0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
220d0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
220e0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
220f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
22100 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
22110 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
22120 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
22130 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
22140 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
22150 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
22160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
22170 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
22180 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
22190 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
221a0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
221b0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
221c0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
221d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
221e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
221f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
22200 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
22210 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
22220 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22230 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
22240 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
22250 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
22260 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
22270 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
22280 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
22290 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
222a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
222b0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
222c0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
222d0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
222e0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
222f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22300 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
22310 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22320 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
22330 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
22340 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
22350 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
22360 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22370 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
22380 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
22390 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
223a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
223b0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
223c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
223d0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
223e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
223f0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22400 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22410 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22430 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22440 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22450 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
22460 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
22470 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22480 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
22490 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
224a0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
224b0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
224c0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
224d0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
224e0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
224f0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22500 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22510 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22520 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22530 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
22540 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22550 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
22560 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
22570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
22580 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
22590 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
225a0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
225b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
225c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
225d0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
225e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
225f0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22600 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22610 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22620 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22630 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
22640 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
22650 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
22660 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
22670 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
22680 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
22690 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
226a0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
226b0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
226c0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
226d0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
226e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
226f0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22700 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22710 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22720 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22730 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
22740 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22750 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22760 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
22770 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
22780 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
22790 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
227a0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
227b0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
227c0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
227d0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
227e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
227f0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22810 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22820 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22830 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22850 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
22860 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22870 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
22880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22890 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
228a0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
228b0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
228c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
228d0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
228e0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
228f0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22900 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22910 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22920 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22930 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22940 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22950 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22960 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22970 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
22980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
229a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
229b0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
229c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
229d0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
229e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
229f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22a00 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22a10 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22a20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22a30 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22a50 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22a60 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22a70 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
22a80 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
22a90 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
22aa0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
22ab0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
22ac0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
22ad0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
22ae0 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
22af0 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22b00 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22b10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22b20 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22b30 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22b40 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22b50 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22b60 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22b70 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
22b80 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
22b90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22ba0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
22bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22bc0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
22bd0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
22be0 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
22bf0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22c00 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22c10 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22c20 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22c30 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22c40 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22c50 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22c60 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22c70 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
22c80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22c90 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
22ca0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
22cb0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
22cc0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
22cd0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
22ce0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
22cf0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22d00 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22d10 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22d20 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22d30 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22d40 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22d50 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22d60 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22d70 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
22d80 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
22d90 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
22da0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
22db0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
22dc0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
22dd0 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
22de0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
22df0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22e00 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22e10 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22e20 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22e30 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22e40 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22e50 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22e60 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22e70 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22e80 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22e90 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
22ea0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
22eb0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
22ec0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
22ed0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
22ee0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
22ef0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22f00 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22f10 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22f20 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22f30 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22f40 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
22f50 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
22f60 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
22f70 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
22f80 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
22f90 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
22fa0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22fb0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22fc0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22fd0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22fe0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22ff0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
23000 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
23010 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
23020 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
23030 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
23040 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
23050 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
23060 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
23070 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
23080 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
23090 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
230a0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
230b0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
230c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
230d0 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
230e0 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
230f0 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
23100 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
23110 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
23120 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
23130 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
23140 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
23150 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
23160 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
23170 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
23180 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
23190 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
231a0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
231b0 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
231c0 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
231d0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
231e0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
231f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
23200 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
23210 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
23220 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
23230 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
23240 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
23250 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
23260 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
23270 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
23280 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
23290 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
232a0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
232b0 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
232c0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
232d0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
232e0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
232f0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
23300 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
23310 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
23320 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
23330 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23340 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
23350 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
23360 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
23370 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
23380 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
23390 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
233a0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
233b0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
233c0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
233d0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
233e0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
233f0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23400 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23410 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23440 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
23450 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
23480 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
23490 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
234c0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
234d0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
234e0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
234f0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23500 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23510 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23520 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23530 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23560 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
23570 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23580 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
23590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
235a0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
235b0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
235c0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235e0 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
235f0 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23600 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23610 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23620 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23630 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
23640 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23650 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
23660 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23670 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
23680 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
23690 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
236a0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
236b0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
236c0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
236d0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
236e0 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
236f0 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23700 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23710 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23720 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23730 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
23740 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
23750 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
23760 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
23770 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
23780 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
23790 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
237a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
237b0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
237c0 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
237d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
237e0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
237f0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23800 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23810 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23820 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23830 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
23840 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
23850 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
23860 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
23870 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
23880 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
23890 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
238a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
238b0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
238c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
238d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
238e0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
238f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23900 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23910 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23920 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23930 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23940 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23950 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23970 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
23980 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
23990 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
239a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
239b0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
239c0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
239d0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
239e0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
239f0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23a00 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23a10 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23a20 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23a30 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23a40 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23a50 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23a60 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23a70 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
23a80 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
23a90 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
23aa0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
23ab0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
23ac0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
23ad0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
23ae0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
23af0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23b00 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23b10 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23b20 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23b30 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23b40 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23b50 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23b60 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23b70 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
23b80 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
23b90 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
23ba0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
23bb0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
23bc0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
23bd0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23be0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
23bf0 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23c00 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23c10 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23c20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23c30 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23c40 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23c50 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23c60 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23c70 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
23c80 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
23c90 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
23ca0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23cb0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
23cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
23cd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23ce0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23d20 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23d60 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23d70 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23da0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
23db0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
23dc0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
23dd0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23df0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23e00 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23e10 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23e40 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23e50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23e60 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23e70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23e80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23ea0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23eb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
23ec0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
23ed0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
23ee0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
23ef0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23f00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23f30 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23f40 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
23f50 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
23f60 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
23f70 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
23f80 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
23f90 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
23fa0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23fb0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23fc0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23fd0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23fe0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23ff0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
24000 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
24010 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
24020 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
24030 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
24040 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24050 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
24060 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
24070 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
24080 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24090 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
240a0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
240b0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
240c0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
240d0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
240e0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
240f0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
24100 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
24110 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
24120 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
24130 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
24140 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
24150 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
24160 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
24170 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
24180 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
24190 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
241a0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
241b0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
241c0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
241d0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
241e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
241f0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
24200 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
24210 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
24220 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
24230 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
24240 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
24250 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
24260 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24270 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
24280 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
24290 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
242a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
242b0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
242c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
242d0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
242e0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
242f0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
24300 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
24310 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
24320 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
24330 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24340 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
24350 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
24360 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
24370 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
24380 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
24390 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
243a0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
243b0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
243c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
243d0 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
243e0 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
243f0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
24400 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24410 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
24420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
24430 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
24440 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
24450 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
24470 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
24480 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
24490 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
244a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
244b0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
244c0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
244d0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
244e0 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
244f0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
24500 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
24510 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
24520 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
24530 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
24540 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
24550 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
24560 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24570 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
24580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
245a0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
245b0 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
245c0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
245d0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
245e0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
245f0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
24600 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
24610 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
24620 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
24630 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
24640 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
24650 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
24660 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
24670 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
24680 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
24690 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
246a0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
246b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
246c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
246d0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
246e0 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
246f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24700 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
24710 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
24720 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
24730 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
24740 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
24750 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
24760 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
24770 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
24780 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a  ur->ix, &info);.
24790 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
247a0 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
247b0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
247c0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
247d0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
247e0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
247f0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
24800 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
24810 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
24820 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
24830 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24840 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
24850 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
24860 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
24870 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
24880 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
24890 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
248a0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
248b0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
248c0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c 26  Page],pCur->ix,&
248d0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
248e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
248f0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
24900 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
24910 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
24920 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
24930 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
24940 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
24950 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
24960 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
24970 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
24980 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
24990 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
249a0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
249b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
249c0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
249d0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
249e0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
249f0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
24a00 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
24a10 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
24a20 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
24a30 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
24a40 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
24a50 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
24a60 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
24a70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24a80 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
24a90 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
24aa0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24ab0 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
24ac0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24ad0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
24ae0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
24af0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24b00 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
24b10 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
24b20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
24b30 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
24b40 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
24b50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24b60 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
24b70 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
24b80 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
24b90 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
24ba0 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
24bb0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
24bc0 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
24bd0 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
24be0 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
24bf0 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
24c00 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
24c10 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
24c20 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
24c30 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24c40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24c50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24c70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24c80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
24c90 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
24ca0 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
24cb0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
24cc0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
24cd0 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
24ce0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
24cf0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
24d00 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
24d10 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
24d20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
24d30 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
24d40 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
24d50 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
24d60 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
24d70 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
24d80 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
24d90 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24da0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
24db0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
24dc0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
24dd0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24de0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
24df0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
24e00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
24e10 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
24e20 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
24e30 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
24e40 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
24e50 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
24e60 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
24e70 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
24e80 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
24e90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
24ea0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24eb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24ec0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24ed0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24ee0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
24ef0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24f00 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24f10 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
24f20 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
24f30 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
24f40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24f50 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
24f60 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
24f70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
24f80 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
24f90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24fa0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
24fb0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
24fc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24fd0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
24fe0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
24ff0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
25000 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
25010 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
25020 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
25030 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
25040 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
25050 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
25060 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
25070 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
25080 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
25090 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
250a0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
250b0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
250c0 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
250d0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
250e0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
250f0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
25100 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
25110 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
25120 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
25130 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
25140 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
25150 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
25160 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
25170 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
25180 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
25190 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
251a0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
251b0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
251c0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
251d0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
251e0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
251f0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25200 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
25210 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
25220 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
25230 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
25240 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
25250 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
25260 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
25270 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
25280 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
25290 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
252a0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
252b0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
252c0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
252d0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
252e0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
252f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
25300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25320 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
25350 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
25360 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
25370 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
25380 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
25390 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
253a0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
253b0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
253c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
253d0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
253e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
253f0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
25400 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
25410 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
25420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25430 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25440 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
25450 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
25460 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
25470 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
25480 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25490 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
254a0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
254b0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
254c0 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
254d0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
254e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
254f0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
25500 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
25510 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
25520 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
25530 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
25540 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
25550 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
25560 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
25570 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
25580 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
25590 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
255a0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
255b0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
255c0 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
255d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
255e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
255f0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
25600 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
25610 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
25620 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
25630 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
25640 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
25650 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25660 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
25670 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
25680 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
25690 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
256a0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
256b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
256c0 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
256d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
256e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
256f0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
25700 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
25710 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
25720 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
25730 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
25740 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
25750 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
25760 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
25770 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
25780 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
25790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
257a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
257b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
257c0 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
257d0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
257e0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
257f0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
25800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
25810 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
25820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
25840 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
25850 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
25860 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
25870 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
25880 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
25890 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
258a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
258b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
258c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
258d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
258e0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
258f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
25900 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
25910 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
25920 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
25930 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
25940 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
25950 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
25960 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
25970 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
25980 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
25990 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
259a0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
259b0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
259c0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
259d0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
259e0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
259f0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
25a00 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
25a10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
25a20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
25a30 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
25a40 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
25a50 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
25a60 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
25a70 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
25a80 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25a90 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
25aa0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
25ab0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
25ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
25ad0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
25ae0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
25af0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
25b00 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
25b10 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
25b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25b30 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
25b40 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
25b70 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
25b80 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
25b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
25ba0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
25bb0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
25bc0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
25bd0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
25be0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
25bf0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
25c00 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
25c10 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
25c20 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
25c30 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
25c40 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
25c50 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
25c60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
25c70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
25c80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25ca0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
25cb0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
25cc0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
25cd0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
25ce0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
25cf0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
25d00 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
25d10 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
25d20 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
25d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25d40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25d50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25d60 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
25d70 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
25d80 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
25d90 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
25da0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
25db0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25dc0 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
25dd0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
25de0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
25df0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
25e00 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
25e10 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
25e20 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25e30 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
25e40 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25e50 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
25e60 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25e70 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
25e80 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
25e90 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
25ea0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
25eb0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
25ec0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
25ed0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
25ee0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
25ef0 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
25f00 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
25f10 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
25f20 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
25f30 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
25f40 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
25f50 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
25f60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
25f70 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
25f80 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
25f90 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
25fa0 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
25fb0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
25fc0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
25fd0 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
25fe0 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
25ff0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26000 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
26010 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
26020 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
26030 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
26040 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
26050 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
26060 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
26070 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26080 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
26090 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
260a0 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
260b0 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
260c0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
260d0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
260e0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
260f0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
26100 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
26110 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
26120 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
26130 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
26140 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
26150 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
26160 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
26170 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
26180 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26190 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
261a0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
261b0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
261c0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
261d0 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
261e0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
261f0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
26200 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
26210 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26220 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
26230 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
26240 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26250 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
26260 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
26270 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
26280 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
26290 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
262a0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
262b0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
262c0 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
262d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
262e0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
262f0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
26300 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
26310 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
26320 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
26330 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26350 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
26360 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
26370 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
26380 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
26390 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
263a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
263b0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
263c0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
263d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
263e0 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
263f0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
26400 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
26410 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
26420 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
26430 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
26440 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
26450 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
26460 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26470 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
26480 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
26490 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
264a0 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
264b0 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
264c0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
264d0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
264e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
264f0 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
26500 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
26510 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26520 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26530 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
26540 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
26550 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26560 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26570 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
26580 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
26590 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
265a0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
265b0 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
265c0 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
265d0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
265e0 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
265f0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
26600 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
26610 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
26620 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
26630 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
26640 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
26650 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
26660 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
26670 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
26680 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
26690 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
266a0 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
266b0 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
266c0 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
266d0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
266e0 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
266f0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
26700 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
26710 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
26720 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
26730 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
26740 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
26750 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
26760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26770 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
26780 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  ge->pgno);.  }..
26790 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
267a0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
267b0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
267c0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
267d0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
267e0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
267f0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
26800 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
26810 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
26820 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
26830 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
26840 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
26850 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
26860 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
26870 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
26880 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
26890 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
268a0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
268b0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
268c0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
268d0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
268e0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
268f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
26900 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
26910 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
26920 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
26930 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
26940 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
26950 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
26960 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
26970 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
26980 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
26990 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
269a0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
269b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
269c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
269d0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
269e0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
269f0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
26a00 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
26a10 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
26a20 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26a30 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
26a40 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
26a50 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
26a60 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
26a70 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26a80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26a90 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
26aa0 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
26ab0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
26ac0 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
26ad0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
26ae0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
26af0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
26b00 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
26b10 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
26b20 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
26b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26b40 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26b50 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
26b70 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
26b80 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
26b90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26ba0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
26bb0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
26bc0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
26bd0 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
26be0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
26bf0 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
26c00 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
26c10 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
26c20 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
26c30 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
26c40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26c50 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
26c60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26c70 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
26c80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26c90 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
26ca0 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
26cb0 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
26cc0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
26cd0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
26ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
26cf0 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
26d00 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
26d10 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
26d20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26d30 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26d40 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ovfl;.    }else{
26d50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
26d60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26d70 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
26d80 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
26d90 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e   the.      ** en
26da0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
26db0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
26dc0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26dd0 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a  d, skip.      **
26de0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
26df0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26e00 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
26e10 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
26e20 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ize] ){.        
26e30 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
26e40 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
26e50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
26e60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26e70 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  x];.        offs
26e80 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
26e90 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lSize);.      }.
26ea0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
26eb0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
26ec0 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20   && amt>0 );.   
26ed0 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65   while( nextPage
26ee0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
26ef0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
26f00 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
26f10 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
26f20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26f30 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26f40 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20  w[iIdx]==0.     
26f50 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
26f60 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26f70 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
26f80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
26f90 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20  RUPT_DB );.     
26fa0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26fb0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
26fc0 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  e;..      if( of
26fd0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
26fe0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
26ff0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
27000 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
27010 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
27020 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27030 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
27040 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
27050 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
27060 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
27070 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
27080 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
27090 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
270a0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
270b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
270c0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
270d0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
270e0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
270f0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
27100 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
27110 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27130 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
27140 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
27150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27160 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
27170 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
27180 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
27190 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
271a0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
271b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
271c0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
271d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
271e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
271f0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
27200 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
27210 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
27220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
27230 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
27240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27250 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
27260 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
27270 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
27280 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
27290 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
272a0 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
272b0 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
272c0 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
272d0 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
272e0 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
272f0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
27300 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
27310 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
27320 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  fd;      /* File
27330 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
27340 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f  o direct overflo
27350 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  w read */.#endif
27360 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
27370 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
27380 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
27390 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
273a0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
273b0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
273c0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
273d0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
273e0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
273f0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
27400 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
27410 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
27420 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
27430 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
27440 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
27450 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
27460 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
27470 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
27480 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
27490 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
274a0 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69   **   3) there i
274b0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
274c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
274d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
274e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
274f0 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
27500 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
27510 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
27520 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
27530 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
27540 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
27550 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
27560 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
27570 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
27580 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
27590 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
275a0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
275b0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
275c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
275d0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
275e0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
275f0 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
27600 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
27610 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
27620 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
27630 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
27640 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
27650 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
27660 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
27670 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
27680 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
276b0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
276c0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276f0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
27700 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
27710 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
27720 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
27750 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
27760 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
27770 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
27780 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29  thods     /* (4)
27790 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
277a0 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
277b0 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
277c0 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20  r, nextPage)    
277d0 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
277e0 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
277f0 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
27820 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  6) */.        ){
27830 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
27840 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
27850 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
27860 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
27870 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
27880 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278a0 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20           /* due 
278b0 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  to (6) */.      
278c0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
278d0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
278e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
278f0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
27900 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
27910 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
27920 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
27930 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27940 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
27950 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
27960 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
27970 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
27980 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
27990 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
279a0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
279b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
279c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
279d0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
279e0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
279f0 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
27a00 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
27a10 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
27a20 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
27a30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27a50 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
27a60 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
27a70 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
27a80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27a90 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
27aa0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27ac0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
27ad0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
27ae0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
27af0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
27b10 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
27b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
27b30 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
27b40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27b50 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
27b60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d  ;.        if( am
27b70 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  t==0 ) return rc
27b80 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
27b90 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
27ba0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
27bb0 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b  k;.      iIdx++;
27bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
27bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27be0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
27bf0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
27c00 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
27c10 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
27c20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27c30 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
27c40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27c50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
27c60 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
27c70 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
27c80 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
27c90 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
27ca0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
27cb0 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
27cc0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
27cd0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
27ce0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
27cf0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
27d00 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
27d10 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
27d20 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
27d30 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
27d40 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
27d50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
27d60 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
27d70 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
27d80 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
27d90 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
27da0 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
27db0 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
27dc0 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
27dd0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
27de0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27df0 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
27e00 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
27e10 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
27e20 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
27e30 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
27e40 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
27e50 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
27e60 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
27e70 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
27e80 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
27e90 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
27ea0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
27eb0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
27ec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
27ed0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
27ee0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
27ef0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
27f00 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
27f10 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
27f20 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
27f30 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
27f40 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
27f50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27f60 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
27f70 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27f80 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
27f90 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
27fa0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27fb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27fc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27fd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27fe0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
27ff0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28000 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
28010 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28020 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
28030 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70  Cur->ix<pCur->ap
28040 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28050 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
28060 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
28070 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
28080 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
28090 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
280a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  }../*.** This va
280b0 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33  riant of sqlite3
280c0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77  BtreePayload() w
280d0 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65  orks even if the
280e0 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a   cursor has not.
280f0 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52  ** in the CURSOR
28100 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49  _VALID state.  I
28110 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
28120 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  y the sqlite3_bl
28130 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74  ob_read().** int
28140 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64  erface..*/.#ifnd
28150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
28160 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53  NCRBLOB.static S
28170 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
28180 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
28190 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72  Checked(.  BtCur
281a0 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32  sor *pCur,.  u32
281b0 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61   offset,.  u32 a
281c0 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  mt,.  void *pBuf
281d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
281e0 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
281f0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
28200 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
28210 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
28220 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  }.  assert( curs
28230 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28240 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  Cur) );.  rc = b
28250 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
28260 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
28270 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72  .  return rc ? r
28280 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c : accessPayloa
28290 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
282a0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d  amt, pBuf, 0);.}
282b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
282c0 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
282d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
282e0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
282f0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
28300 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
28310 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28320 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
28330 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
28340 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
28350 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
28360 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
28370 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
28380 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
28390 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
283a0 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75  yloadChecked(pCu
283b0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
283c0 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pBuf);.  }.}.#en
283d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
283e0 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
283f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
28400 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
28410 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
28420 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
28430 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
28440 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
28450 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
28460 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
28470 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
28480 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
28490 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
284a0 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
284b0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
284c0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
284d0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
284e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
284f0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
28500 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
28510 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
28520 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
28530 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
28540 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
28550 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
28560 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
28570 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28580 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
28590 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
285a0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
285b0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
285c0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
285d0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
285e0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
285f0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
28600 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
28610 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
28620 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
28630 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
28640 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
28650 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
28660 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
28670 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
28680 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
28690 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
286a0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
286b0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
286c0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
286d0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
286e0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
286f0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
28700 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
28710 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
28720 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
28730 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
28740 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
28750 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
28760 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
28770 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
28780 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
28790 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
287a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
287b0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
287c0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
287d0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
287e0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
287f0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
28800 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
28810 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
28820 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
28830 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
28840 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
28850 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
28860 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
28870 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
28880 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
28890 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
288a0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
288b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
288c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
288d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
288e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
288f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
28900 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
28910 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28920 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28930 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28940 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70  Cur->ix<pCur->ap
28950 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28960 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
28970 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
28980 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
28990 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
289a0 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
289b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
289c0 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
289d0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
289e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
289f0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
28a00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28a10 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
28a20 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
28a30 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
28a40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28a50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
28a60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
28a70 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
28a80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
28a90 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
28aa0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
28ab0 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
28ac0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
28ad0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28ae0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
28af0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
28b00 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
28b10 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
28b20 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
28b30 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
28b40 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
28b50 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
28b60 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
28b70 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
28b80 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
28b90 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
28ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
28bb0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
28bc0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
28bd0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
28be0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
28bf0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
28c00 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
28c10 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
28c20 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
28c30 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
28c40 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
28c50 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
28c60 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
28c70 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
28c80 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
28c90 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
28ca0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
28cb0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
28cc0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
28cd0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
28ce0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
28cf0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
28d00 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
28d10 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
28d20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
28d30 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
28d40 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74  ePayloadFetch(Bt
28d50 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
28d60 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
28d70 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
28d80 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
28d90 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28da0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
28db0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
28dc0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
28dd0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
28de0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
28df0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
28e00 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
28e10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
28e20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
28e30 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
28e40 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
28e50 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
28e60 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
28e70 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
28e80 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
28e90 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
28ea0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
28eb0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
28ec0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
28ed0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
28ee0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
28ef0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
28f00 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
28f10 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
28f20 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
28f30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28f40 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
28f50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28f60 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28f90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28fa0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28fb0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
28fc0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
28fd0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
28fe0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
28ff0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
29000 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
29010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29020 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29030 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
29040 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
29050 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
29060 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
29070 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
29080 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  );.  pCur->aiIdx
29090 5b 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 5d 20  [pCur->iPage++] 
290a0 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43  = pCur->ix;.  pC
290b0 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 72 65  ur->ix = 0;.  re
290c0 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
290d0 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
290e0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
290f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
29120 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
29130 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
29140 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
29150 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
29160 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
29170 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
29180 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
29190 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
291a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
291b0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
291c0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
291d0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
291e0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
291f0 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
29200 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
29210 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
29220 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
29230 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
29240 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
29250 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
29260 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
29270 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
29280 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
29290 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
292a0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
292b0 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
292c0 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
292d0 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
292e0 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
292f0 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
29300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29320 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
29330 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
29340 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
29350 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
29360 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
29370 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
29380 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
29390 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
293a0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
293b0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
293c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
293d0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
293e0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
293f0 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
29400 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
29410 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
29420 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
29430 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
29440 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29450 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
29460 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
29470 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
29480 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
29490 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
294a0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
294b0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
294c0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
294d0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
294e0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
294f0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
29500 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
29510 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
29520 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
29530 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
29540 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
29550 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
29560 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29570 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29580 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29590 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
295a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
295b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
295c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
295d0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
295e0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
295f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
29600 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
29610 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
29620 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29630 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
29640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29650 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
29660 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29670 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
29680 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
29690 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
296a0 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
296b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
296c0 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
296d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
296e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
296f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29700 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29710 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
29720 70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d  pCur->ix = pCur-
29730 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29740 67 65 2d 31 5d 3b 0a 20 20 72 65 6c 65 61 73 65  ge-1];.  release
29750 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
29760 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29770 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  Page--]);.}../*.
29780 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
29790 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
297a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
297b0 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
297c0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
297d0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
297e0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
297f0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
29800 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
29810 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
29820 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
29830 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
29840 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
29850 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
29860 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
29870 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
29880 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
29890 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
298a0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
298b0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
298c0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
298d0 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
298e0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
298f0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
29900 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
29910 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
29920 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
29930 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
29940 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
29950 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
29960 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
29970 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
29980 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
29990 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
299a0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
299b0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
299c0 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
299d0 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
299e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
299f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
29a00 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
29a10 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
29a20 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
29a30 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
29a40 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
29a50 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
29a60 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
29a70 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
29a80 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
29a90 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
29aa0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
29ab0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
29ac0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
29ad0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
29ae0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
29af0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
29b00 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
29b10 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
29b20 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
29b30 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
29b40 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
29b50 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
29b60 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
29b70 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
29b80 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
29b90 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
29ba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29bb0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
29bc0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
29bd0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
29be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29c00 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
29c10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29c20 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
29c30 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
29c40 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
29c50 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
29c60 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
29c70 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
29c80 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
29c90 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
29ca0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
29cb0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29cc0 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
29cd0 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
29ce0 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
29cf0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29d00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29d10 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
29d20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
29d30 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
29d40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
29d50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
29d60 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
29d70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29d80 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
29d90 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
29da0 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
29db0 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29dc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29dd0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29de0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29df0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29e00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29e30 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29e40 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  ==(-1) );.    if
29e50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
29e60 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
29e70 45 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EK ){.      if( 
29e80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29e90 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
29ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29eb0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
29ec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
29ed0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29ee0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  skipNext;.      
29ef0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
29f00 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
29f10 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
29f20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
29f30 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
29f40 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
29f50 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
29f60 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
29f90 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
29fa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29fb0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
29fc0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29fd0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
29fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29ff0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
2a000 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
2a010 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
2a020 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2a030 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
2a040 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2a050 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
2a060 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
2a070 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
2a080 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
2a090 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
2a0a0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
2a0b0 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
2a0c0 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
2a0d0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
2a0e0 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
2a0f0 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
2a100 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
2a110 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
2a120 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
2a130 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
2a140 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2a150 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
2a160 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
2a170 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
2a180 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
2a190 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2a1a0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2a1b0 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
2a1c0 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
2a1d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
2a1e0 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
2a1f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2a200 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
2a210 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
2a220 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
2a230 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
2a240 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2a250 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
2a260 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
2a270 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
2a280 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
2a290 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
2a2a0 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
2a2b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
2a2c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
2a2d0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
2a2e0 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
2a2f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
2a300 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
2a310 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2a320 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
2a330 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
2a340 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a350 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50 61 67  PGNO(pCur->apPag
2a360 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a370 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70  pgno);.  }..skip
2a380 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d  _init:  .  pCur-
2a390 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2a3a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2a3b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2a3c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2a3d0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
2a3e0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a3f0 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43  );..  pRoot = pC
2a400 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2a410 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
2a420 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
2a430 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a440 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
2a450 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
2a460 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
2a470 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
2a480 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
2a490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2a4a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
2a4b0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
2a4c0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
2a4d0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
2a4e0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2a4f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2a500 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2a510 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2a520 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
2a530 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
2a540 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2a550 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
2a560 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a570 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2a580 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
2a590 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
2a5a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2a5b0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
2a5c0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2a5d0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
2a5e0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
2a5f0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
2a600 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
2a610 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
2a620 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2a630 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2a640 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
2a650 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2a660 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2a670 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2a680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2a690 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2a6a0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a6b0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a6d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a6e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2a6f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2a700 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
2a710 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a720 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
2a730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2a740 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2a750 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2a760 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2a770 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2a780 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2a790 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2a7a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2a7b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a7c0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a7d0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2a7e0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2a7f0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2a800 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2a810 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2a820 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2a830 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2a840 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2a850 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2a860 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2a870 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2a880 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2a890 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2a8a0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2a8b0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2a8c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a8d0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2a8e0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2a8f0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2a900 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2a910 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2a920 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2a930 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2a940 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2a950 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2a960 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2a970 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2a980 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2a990 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2a9a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2a9b0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2a9c0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2a9d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a9e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a9f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2aa00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2aa10 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2aa20 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2aa30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2aa40 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
2aa50 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
2aa60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2aa70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2aa80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2aa90 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
2aaa0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
2aab0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2aac0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
2aad0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2aae0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
2aaf0 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2ab00 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
2ab10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2ab20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
2ab30 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ab40 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2ab50 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2ab60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2ab70 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2ab80 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2ab90 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2aba0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2abb0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
2abc0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
2abd0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
2abe0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
2abf0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
2ac00 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
2ac10 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
2ac20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2ac30 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
2ac40 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2ac50 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2ac60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2ac70 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ac80 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ac90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2aca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2acb0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2acc0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2acd0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2ace0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2acf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2ad00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ad10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
2ad20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ad30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2ad40 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2ad50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2ad60 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
2ad70 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2ad80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2ad90 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2ada0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2adb0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
2adc0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2add0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2ade0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2adf0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ae00 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2ae10 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2ae20 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2ae30 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2ae40 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2ae50 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2ae60 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2ae70 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2ae80 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2ae90 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2aea0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2aeb0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2aec0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2aed0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
2aee0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2aef0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2af00 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
2af10 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2af20 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2af30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2af40 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2af50 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2af60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2af70 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
2af80 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
2af90 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
2afa0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
2afb0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2afc0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
2afd0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2afe0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2aff0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2b000 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
2b010 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
2b020 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2b030 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
2b040 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
2b050 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
2b060 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2b070 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
2b080 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
2b090 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
2b0a0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2b0b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b0c0 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
2b0d0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
2b0e0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
2b0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2b100 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
2b110 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2b120 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
2b130 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2b140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2b150 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2b160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b170 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2b180 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2b190 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2b1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2b1b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2b1c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2b1d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b1e0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2b1f0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2b200 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2b210 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
2b220 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2b230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2b240 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2b250 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2b260 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2b270 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
2b280 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2b290 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
2b2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b2b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2b2c0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2b2d0 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
2b2e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
2b2f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2b300 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2b310 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
2b320 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b330 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2b340 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2b350 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2b360 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2b370 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2b380 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2b390 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2b3a0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2b3b0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2b3c0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2b3d0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2b3e0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2b3f0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2b400 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2b410 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2b420 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2b430 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2b440 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2b450 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2b460 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2b470 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2b480 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b490 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2b4a0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2b4b0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2b4c0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2b4d0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2b4e0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2b4f0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2b500 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2b510 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2b520 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2b530 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2b540 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2b550 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2b560 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2b570 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2b580 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2b590 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2b5a0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2b5b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2b5c0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2b5d0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2b5e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2b5f0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2b600 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2b610 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2b620 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2b630 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2b640 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2b650 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2b660 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2b670 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2b680 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2b690 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2b6a0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2b6b0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2b6c0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2b6d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2b6e0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2b6f0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2b720 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2b730 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2b740 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2b750 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2b760 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2b770 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2b780 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2b790 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2b7a0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f  IdxKey..**.** Fo
2b7b0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2b7c0 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53  the pIdxKey->eqS
2b7d0 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74  een field is set
2b7e0 20 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a   to 1 if there.*
2b7f0 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72  * exists an entr
2b800 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  y in the table t
2b810 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63  hat exactly matc
2b820 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a  hes pIdxKey.  .*
2b830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2b840 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2b850 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2b860 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
2b870 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
2b880 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
2b890 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
2b8a0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
2b8b0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
2b8c0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
2b8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b8e0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
2b8f0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
2b900 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2b910 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
2b920 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
2b930 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
2b940 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
2b950 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
2b960 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
2b970 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2b980 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
2b990 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
2b9a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b9b0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b9c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b9d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b9e0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2b9f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2ba00 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
2ba10 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
2ba20 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2ba30 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
2ba40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ba50 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ba60 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79  ALID || (pIdxKey
2ba70 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72  ==0)==(pCur->cur
2ba80 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20  IntKey!=0) );.. 
2ba90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2baa0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2bab0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2bac0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2bad0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2bae0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2baf0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2bb00 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2bb10 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a   if( pIdxKey==0.
2bb20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
2bb30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2bb40 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2bb50 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2bb60 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20  NKey)!=0.  ){.  
2bb70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2bb80 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2bb90 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2bba0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2bbb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2bbc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2bbd0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
2bbe0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  {.      if( (pCu
2bbf0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2bc00 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2bc10 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2bc20 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -1;.        ret
2bc30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2bc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
2bc50 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2bc60 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65   key is one more
2bc70 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
2bc80 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20  us key, then.   
2bc90 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74     ** try to get
2bca0 20 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c   there using sql
2bcb0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2bcc0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75  rather than a fu
2bcd0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61  ll.      ** bina
2bce0 72 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73  ry search.  This
2bcf0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2bd00 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ion only.  The c
2bd10 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20  orrect answer.  
2bd20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2bd30 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
2bd40 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79   this case, only
2bd50 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73   a little more s
2bd60 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20  lowely */.      
2bd70 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2bd80 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26  Key+1==intKey &&
2bd90 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   !pCur->skipNext
2bda0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2bdb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
2bdc0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2bdd0 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
2bde0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2bdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be00 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
2be10 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
2be20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2be30 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2be40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2be50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2be60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2be70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2be80 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2be90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2beb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bec0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2bed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2bee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2bef0 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
2bf00 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2bf10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
2bf20 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
2bf30 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
2bf40 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
2bf50 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
2bf60 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
2bf70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2bf80 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2bf90 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
2bfa0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2bfb0 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
2bfc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
2bfd0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
2bfe0 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
2bff0 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
2c000 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2c010 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2c020 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2c030 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2c040 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2c050 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2c060 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c070 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
2c080 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2c090 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2c0a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2c0b0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2c0c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c0d0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2c0e0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2c0f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2c100 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
2c110 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c120 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
2c130 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2c140 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c150 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2c160 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2c170 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2c180 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
2c190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c1a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2c1b0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2c1c0 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2c1d0 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2c1e0 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2c1f0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2c200 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2c210 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2c220 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2c230 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2c240 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2c250 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c260 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  age];.    u8 *pC
2c270 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c290 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
2c2a0 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
2c2b0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61  e */..    /* pPa
2c2c0 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
2c2d0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
2c2e0 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
2c2f0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
2c300 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
2c310 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
2c320 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
2c330 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
2c340 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
2c350 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
2c360 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
2c370 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
2c380 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
2c390 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
2c3a0 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
2c3b0 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
2c3c0 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
2c3d0 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
2c3e0 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
2c3f0 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
2c400 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
2c410 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
2c420 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
2c430 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
2c440 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
2c450 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
2c460 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
2c470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c480 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
2c490 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2c4a0 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
2c4b0 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
2c4c0 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
2c4d0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
2c4e0 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67   assert( biasRig
2c4f0 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67  ht==0 || biasRig
2c500 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78  ht==1 );.    idx
2c510 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52   = upr>>(1-biasR
2c520 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20  ight); /* idx = 
2c530 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20  biasRight ? upr 
2c540 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  : (lwr+upr)/2; *
2c550 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  /.    pCur->ix =
2c560 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69   (u16)idx;.    i
2c570 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  f( xRecordCompar
2c580 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==0 ){.      fo
2c590 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2c5a0 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
2c5b0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2c5c0 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2c5d0 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20  ge, idx);.      
2c5e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2c5f0 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  KeyLeaf ){.     
2c600 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
2c610 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
2c620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2c630 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
2c640 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20  aDataEnd ){.    
2c650 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c660 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c670 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
2c680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2c690 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2c6b0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2c6c0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2c6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2c6e0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2c6f0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2c700 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2c710 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2c720 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2c730 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2c740 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2c750 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2c760 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2c770 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2c780 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2c790 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2c7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c7b0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2c7c0 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2c7d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2c7e0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c7f0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2c800 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2c810 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
2c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c830 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
2c840 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
2c850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c860 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c870 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2c880 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2c890 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2c8a0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2c8b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2c8c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2c8d0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2c8e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2c8f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c900 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2c910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c920 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2c930 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2c940 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2c950 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2c960 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2c970 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c980 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2c990 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2c9a0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2c9b0 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2c9c0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2c9d0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c9e0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2c9f0 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2ca00 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2ca10 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2ca20 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2ca30 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2ca40 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2ca50 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2ca60 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2ca70 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2ca80 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2ca90 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2caa0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2cab0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2cac0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2cad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2cae0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2caf0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2cb00 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2cb10 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2cb20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2cb30 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2cb40 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2cb50 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2cb60 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2cb70 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2cb80 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2cb90 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2cba0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2cbb0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2cbc0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2cbd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2cbe0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2cbf0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2cc00 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2cc10 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2cc20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2cc30 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2cc40 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2cc50 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2cc60 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2cc70 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2cc80 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2cc90 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2cca0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2ccb0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2ccc0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2ccd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2cce0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2ccf0 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2cd00 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2cd10 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2cd20 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2cd30 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2cd40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2cd50 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2cd60 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2cd70 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2cd80 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2cd90 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2cda0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2cdb0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2cdc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2cdd0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2cde0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2cdf0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2ce00 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2ce10 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2ce20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2ce30 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2ce40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2ce50 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2ce60 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2ce70 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2ce80 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2ce90 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2cea0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2ceb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ced0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2cee0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2cef0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2cf00 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2cf10 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2cf20 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2cf30 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2cf40 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2cf50 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2cf60 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2cf70 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2cf80 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2cf90 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2cfa0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2cfb0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2cfc0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2cfd0 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2cfe0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2cff0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2d000 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2d010 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2d020 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2d030 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2d040 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2d050 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2d060 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2d070 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2d080 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2d090 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2d0a0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2d0b0 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2d0c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2d0d0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2d0e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2d0f0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2d100 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2d110 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2d120 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2d130 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2d140 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2d150 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2d160 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2d170 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2d180 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2d190 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2d1a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2d1b0 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2d1c0 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2d1d0 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2d1e0 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2d1f0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2d200 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2d210 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2d220 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2d230 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2d240 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2d250 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2d260 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2d270 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2d280 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2d290 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2d2a0 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2d2b0 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2d2c0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2d2d0 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2d2e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2d2f0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
2d300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2d310 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d320 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2d330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2d340 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2d350 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2d360 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2d370 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2d380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2d390 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2d3a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2d3b0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2d3c0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2d3d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2d3e0 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2d3f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d400 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2d410 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2d420 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2d430 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
2d440 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2d450 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
2d460 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20  lidOvfl;.       
2d470 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2d480 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d490 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2d4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2d4b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d4d0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2d4e0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2d4f0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2d500 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2d510 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2d520 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2d530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d540 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2d550 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2d560 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2d570 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2d580 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2d590 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2d5a0 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2d5b0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2d5c0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2d5d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2d5e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2d5f0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2d600 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2d610 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2d620 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2d630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2d650 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2d660 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d670 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d680 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2d690 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2d6a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2d6b0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2d6c0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2d6d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2d6e0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d6f0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2d700 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
2d710 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
2d720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2d730 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2d740 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2d750 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2d760 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
2d770 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2d780 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
2d790 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
2d7a0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2d7b0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
2d7c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d7d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
2d7e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2d7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d800 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70  Cur->ix<pCur->ap
2d810 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2d820 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2d830 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2d840 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2d850 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2d860 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d870 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d880 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2d890 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2d8a0 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2d8b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d8c0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2d8d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2d8e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d8f0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2d900 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2d910 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2d920 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2d930 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2d940 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77  ur->ix = (u16)lw
2d950 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2d960 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2d970 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2d980 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2d990 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2d9a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d9b0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2d9c0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d9d0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2d9e0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2d9f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2da00 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2da10 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2da20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2da30 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2da40 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2da50 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2da60 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2da70 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2da80 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2da90 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2daa0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2dab0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2dac0 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2dad0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2dae0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2daf0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2db00 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2db10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2db20 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2db30 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2db40 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2db50 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2db60 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2db70 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2db80 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2db90 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2dba0 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2dbb0 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2dbc0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2dbd0 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2dbe0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2dbf0 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2dc00 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2dc10 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2dc20 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2dc30 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61  Return an estima
2dc40 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  te for the numbe
2dc50 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2dc60 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72   table that pCur
2dc70 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20   is.** pointing 
2dc80 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  to.  Return a ne
2dc90 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2dca0 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20   no estimate is 
2dcb0 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76  currently .** av
2dcc0 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20  ailable..*/.i64 
2dcd0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
2dce0 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72  ountEst(BtCursor
2dcf0 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e   *pCur){.  i64 n
2dd00 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73  ;.  u8 i;..  ass
2dd10 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2dd20 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2dd30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2dd40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2dd50 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2dd60 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2dd70 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69  Currently this i
2dd80 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79  nterface is only
2dd90 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f   called by the O
2dda0 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a  P_IfSmaller.  **
2ddb0 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20   opcode, and it 
2ddc0 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75  that case the cu
2ddd0 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73  rsor will always
2dde0 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20   be valid and.  
2ddf0 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70  ** will always p
2de00 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e  oint to a leaf n
2de10 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ode. */.  if( NE
2de20 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
2de30 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  !=CURSOR_VALID) 
2de40 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
2de50 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61  f( NEVER(pCur->a
2de60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2de70 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72  e]->leaf==0) ) r
2de80 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72  eturn -1;..  for
2de90 28 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d 70 43  (n=1, i=0; i<=pC
2dea0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
2deb0 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e  .    n *= pCur->
2dec0 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c  apPage[i]->nCell
2ded0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
2dee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
2def0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
2df00 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
2df10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2df20 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75   .** Return valu
2df30 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
2df40 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63  TE_OK        suc
2df50 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54  cess.**    SQLIT
2df60 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73  E_DONE      curs
2df70 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2df80 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
2df90 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20  st element.**   
2dfa0 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
2dfb0 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
2dfc0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
2dfd0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2dfe0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2dff0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2e000 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2e010 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2e020 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2e030 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2e040 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2e050 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2e060 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2e070 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2e080 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2e090 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2e0a0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2e0b0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2e0c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2e0d0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2e0e0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2e0f0 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2e100 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2e110 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
2e120 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
2e130 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c   argument in sql
2e140 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c  ite3BtreeNext(C,
2e150 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68  F) is 1, then th
2e160 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72  e.** cursor corr
2e170 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2e180 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
2e190 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2e1a0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
2e1b0 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
2e1c0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
2e1d0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
2e1e0 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  he F argument.**
2e1f0 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
2e200 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51  e implement.  SQ
2e210 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2e220 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2e230 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68  ot use.** this h
2e240 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2e250 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2e260 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2e270 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2e280 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2e290 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2e2a0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2e2b0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2e2c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e2d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e2e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2e2f0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2e300 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2e310 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
2e320 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e330 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2e340 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2e350 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2e360 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2e370 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
2e380 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2e390 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2e3a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e3b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e3c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e3d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2e3e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2e3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e400 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
2e410 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2e420 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2e430 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2e440 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2e450 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2e460 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2e470 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2e480 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e490 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2e4a0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e4b0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2e4c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e4d0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2e4e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2e500 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e510 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2e520 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e530 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e540 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2e550 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ix;.  assert( pP
2e560 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2e570 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2e580 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2e590 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2e5a0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2e5b0 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2e5c0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2e5d0 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2e5e0 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2e5f0 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2e600 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2e610 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2e620 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2e630 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2e640 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2e650 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2e660 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e670 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2e680 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2e690 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2e6a0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2e6b0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2e6c0 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2e6d0 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2e6e0 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2e6f0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2e700 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2e710 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e720 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2e730 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2e740 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2e750 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2e760 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2e770 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2e780 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2e790 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2e7a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2e7b0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2e7c0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2e7d0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2e7e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2e7f0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2e800 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2e810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2e820 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2e830 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
2e840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e850 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
2e860 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e  while( pCur->ix>
2e870 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
2e880 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2e890 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2e8a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
2e8b0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
2e8c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e8e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2e8f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2e900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2e920 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2e930 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2e940 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
2e950 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
2e960 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2e970 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d  nt flags){.  Mem
2e980 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55  Page *pPage;.  U
2e990 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e9a0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
2e9b0 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
2e9c0 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
2e9d0 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
2e9e0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e9f0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ea00 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
2ea10 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20  | flags==1 );.  
2ea20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2ea30 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2ea40 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ea50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
2ea60 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2ea70 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2ea80 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2ea90 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2eaa0 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70  idOvfl);.  if( p
2eab0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2eac0 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75  SOR_VALID ) retu
2ead0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2eae0 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
2eaf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2eb00 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
2eb10 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61  ++pCur->ix)>=pPa
2eb20 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2eb30 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
2eb40 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2eb50 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69  t(pCur);.  }.  i
2eb60 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2eb70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2eb80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2eb90 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2eba0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2ebb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2ebc0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
2ebd0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
2ebe0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
2ebf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ec00 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  ..** Return valu
2ec10 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  es:.**.**     SQ
2ec20 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63  LITE_OK     succ
2ec30 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ess.**     SQLIT
2ec40 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72  E_DONE   the cur
2ec50 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
2ec60 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  n the first elem
2ec70 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
2ec80 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73  .**     otherwis
2ec90 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
2eca0 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
2ecb0 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
2ecc0 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2ecd0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2ece0 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
2ecf0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2ed00 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2ed10 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2ed20 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
2ed30 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2ed40 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2ed50 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
2ed60 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
2ed70 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2ed80 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2ed90 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
2eda0 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
2edb0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2edc0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2edd0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2ede0 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
2edf0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2ee00 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
2ee10 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
2ee20 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
2ee30 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2ee40 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  s(C,F) is 1, the
2ee50 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  n.** the cursor 
2ee60 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2ee70 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
2ee80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2ee90 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
2eea0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
2eeb0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2eec0 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
2eed0 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
2eee0 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74  t is a.** hint t
2eef0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
2ef00 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c    The native SQL
2ef10 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2ef20 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2ef30 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69  t.** use this hi
2ef40 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2ef50 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2ef60 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2ef70 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2ef80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ef90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2efa0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2efb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2efc0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2efd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2efe0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2eff0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f000 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f010 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2f020 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2f030 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2f040 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2f050 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
2f060 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f070 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2f080 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f090 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f0a0 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
2f0b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2f0c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2f0d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f0e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2f0f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2f100 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2f110 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2f120 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f130 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2f140 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2f150 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2f160 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2f170 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f180 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2f190 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2f1a0 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2f1b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2f1c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2f1d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2f1e0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2f1f0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2f200 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2f210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f230 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2f240 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2f250 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2f260 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f270 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2f280 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2f290 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f2a0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2f2b0 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20   = pCur->ix;.   
2f2c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2f2d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2f2e0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2f2f0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2f300 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f310 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2f320 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2f330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2f340 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30  ile( pCur->ix==0
2f350 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2f360 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2f370 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2f380 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2f390 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2f3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2f3b0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
2f3c0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2f3d0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ur);.    }.    a
2f3e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2f3f0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2f400 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2f410 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2f420 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2f430 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69   );..    pCur->i
2f440 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  x--;.    pPage =
2f450 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2f460 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2f470 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2f480 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2f490 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2f4a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f4b0 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20  ious(pCur, 0);. 
2f4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f4e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f4f0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
2f500 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2f510 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2f520 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2f530 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2f540 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2f550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
2f560 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
2f570 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2f580 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2f590 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2f5a0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2f5b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2f5c0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
2f5d0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
2f5e0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
2f5f0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43  e SQLite */.  pC
2f600 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f610 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2f620 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2f630 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
2f640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f650 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
2f660 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2f670 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
2f680 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70  r->ix==0.   || p
2f690 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2f6a0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d  ->iPage]->leaf==
2f6b0 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2f6c0 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
2f6d0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pCur);.  }.  pCu
2f6e0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
2f6f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f700 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2f710 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
2f720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
2f740 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
2f750 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
2f760 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
2f770 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
2f780 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
2f790 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
2f7a0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
2f7b0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
2f7c0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
2f7d0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
2f7e0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
2f7f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2f800 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
2f810 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2f820 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
2f830 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
2f840 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2f850 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2f860 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
2f870 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
2f880 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
2f890 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
2f8a0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
2f8b0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2f8c0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
2f8d0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
2f8e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2f8f0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
2f900 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
2f910 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
2f920 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
2f930 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
2f940 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
2f950 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
2f960 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
2f970 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
2f980 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
2f990 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2f9a0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
2f9b0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
2f9c0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2f9d0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
2f9e0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
2f9f0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
2fa00 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
2fa10 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
2fa20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
2fa30 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2fa40 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
2fa50 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
2fa60 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
2fa70 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
2fa80 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
2fa90 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
2faa0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2fab0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
2fac0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
2fad0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
2fae0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
2faf0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
2fb00 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
2fb10 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
2fb20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2fb30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2fb40 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
2fb50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2fb60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
2fb70 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
2fb80 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
2fb90 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
2fba0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
2fbb0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
2fbc0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
2fbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2fbe0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
2fbf0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
2fc00 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
2fc10 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2fc20 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
2fc30 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
2fc40 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
2fc50 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
2fc60 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
2fc70 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
2fc80 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2fc90 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
2fca0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
2fcb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2fcc0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2fcd0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
2fce0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2fcf0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
2fd00 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
2fd10 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
2fd20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
2fd30 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
2fd40 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
2fd50 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
2fd60 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
2fd70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2fd80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2fd90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2fda0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2fdb0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
2fdc0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
2fdd0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
2fde0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
2fdf0 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
2fe00 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2fe10 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
2fe20 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2fe30 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
2fe40 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
2fe50 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
2fe60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2fe70 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
2fe80 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
2fe90 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
2fea0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2feb0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
2fec0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
2fed0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2fee0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
2fef0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
2ff00 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
2ff10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ff20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ff30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
2ff40 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2ff50 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
2ff60 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
2ff70 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
2ff80 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
2ff90 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
2ffa0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2ffb0 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
2ffc0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
2ffd0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
2ffe0 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
2fff0 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
30000 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
30010 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
30020 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
30030 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
30040 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
30050 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
30060 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
30070 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
30080 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
30090 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
300a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
300b0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
300c0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
300d0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
300e0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
300f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
30100 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30110 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
30120 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
30130 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
30140 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
30150 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
30160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30170 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
30180 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
30190 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
301a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
301b0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
301c0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
301d0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
301e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
301f0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
30200 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
30210 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
30220 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
30230 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30240 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
30250 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
30260 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30270 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
30280 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
30290 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
302a0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
302b0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
302c0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
302d0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
302e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
302f0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
30300 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
30310 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
30320 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30330 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
30340 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30350 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
30360 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
30370 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
30380 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
30390 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
303a0 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
303b0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
303c0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
303d0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
303e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
303f0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
30400 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
30410 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
30420 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
30430 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
30440 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
30450 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
30460 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
30470 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
30480 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
30490 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
304a0 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
304b0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
304c0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
304d0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
304e0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
304f0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
30500 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
30510 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
30520 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
30530 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
30540 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
30550 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
30560 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
30570 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
30580 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
30590 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
305a0 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
305b0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
305c0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
305d0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
305e0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
305f0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
30600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
30610 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
30620 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
30630 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
30640 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
30650 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
30660 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
30670 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
30680 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
30690 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
306a0 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
306b0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
306c0 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
306d0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
306e0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
306f0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
30700 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
30710 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
30720 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
30730 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20  Trunk>mxPage || 
30740 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b  nSearch++ > n ){
30750 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30760 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
30770 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70  O(pPrevTrunk ? p
30780 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20  PrevTrunk->pgno 
30790 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 1);.      }els
307a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
307b0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
307c0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
307d0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
307e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
307f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
30800 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
30810 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30820 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
30830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30840 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
30850 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
30860 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20  ->aData!=0 );.  
30870 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
30880 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39  OF: R-13523-0439
30890 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74  4 The second int
308a0 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
308b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
308c0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75      ** is the nu
308d0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
308e0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f  e pointers to fo
308f0 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b  llow. */.      k
30900 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
30910 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
30920 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
30930 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
30940 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
30950 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
30960 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
30970 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
30980 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
30990 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
309a0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
309b0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
309c0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
309d0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
309e0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
309f0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
30a00 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
30a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30a20 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
30a30 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30a40 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
30a50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30a60 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30a80 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
30a90 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
30aa0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
30ab0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
30ac0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30ad0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
30ae0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
30af0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
30b00 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
30b10 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
30b20 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
30b30 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
30b40 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
30b50 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
30b60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
30b70 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
30b80 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
30b90 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
30ba0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
30bb0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
30bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30bd0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
30be0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
30bf0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30c00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
30c10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30c20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30c30 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
30c40 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
30c50 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
30c60 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
30c70 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30c80 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
30c90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
30ca0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
30cb0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
30cc0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
30cd0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
30ce0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
30cf0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
30d00 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
30d10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30d20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
30d30 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
30d40 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
30d50 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30d60 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30d70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30d80 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
30d90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30da0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30db0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
30dc0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
30de0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
30df0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
30e00 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
30e10 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
30e20 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
30e30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30e40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30e70 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
30e80 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30e90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
30ec0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30ed0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
30ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30ef0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
30f00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
30f10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30f20 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
30f30 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
30f40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
30f50 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
30f60 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
30f70 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
30f80 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
30f90 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
30fa0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
30fb0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
30fc0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
30fd0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
30fe0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
30ff0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
31000 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
31010 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
31020 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
31030 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31040 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
31050 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
31060 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
31070 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
31080 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31090 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
310a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
310b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
310c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
310d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
310e0 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
310f0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
31100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
31110 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
31120 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
31130 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
31140 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31160 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31170 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31180 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
31190 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
311a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
311b0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
311c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
311d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
311e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
311f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
31200 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
31210 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31220 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31240 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
31250 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31260 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31270 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31280 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
31290 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
312a0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
312b0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
312c0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
312d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
312e0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
312f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31300 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
31310 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
31320 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
31330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
31340 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31350 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
31360 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
31370 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31380 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
31390 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
313a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
313b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
313c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
313d0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
313e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
313f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
31400 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
31410 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31420 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
31430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
31440 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
31450 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
31460 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
31470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31480 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
31490 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
314a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
314b0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
314c0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
314d0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
314e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
314f0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
31500 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
31510 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
31520 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
31530 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
31540 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
31550 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
31560 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
31570 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
31580 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
31590 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
315a0 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
315b0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
315c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
315d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
315e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
315f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
31600 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
31610 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
31620 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
31630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
31640 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
31650 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
31660 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
31670 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
31680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
316a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
316b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
316c0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
316d0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
316e0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
316f0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
31700 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
31710 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
31720 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
31730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31740 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
31750 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
31760 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
31770 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
31780 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
31790 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
317a0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
317b0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
317c0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
317e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
317f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31810 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
31820 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
31830 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
31840 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
31850 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
31860 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
31870 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
31880 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
31890 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
318a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
318b0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75  ORRUPT_PGNO(iTru
318c0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  nk);.          g
318d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
318e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
318f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
31900 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
31910 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31920 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
31930 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
31940 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
31950 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
31960 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
31970 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
31980 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
31990 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
319a0 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
319b0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
319c0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
319d0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
319e0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
31a00 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
31a10 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
31a20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
31a30 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
31a40 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
31a50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
31a60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31a70 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
31a80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31a90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
31aa0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31ac0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
31ad0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
31ae0 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
31af0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
31b00 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
31b10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31b20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
31b30 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
31b40 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
31b50 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
31b60 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
31b70 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
31b80 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
31b90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
31ba0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
31bb0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
31bc0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
31bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31bf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31c00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31c10 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
31c20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
31c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31c40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31c50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31c60 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
31c70 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
31c80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31c90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
31ca0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
31cb0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
31cc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
31cd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
31ce0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
31cf0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
31d00 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
31d10 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
31d20 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
31d30 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
31d40 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
31d50 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
31d60 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
31d70 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
31d80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
31d90 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
31da0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
31db0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
31dc0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
31dd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
31de0 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
31df0 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
31e00 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
31e10 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
31e20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
31e30 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
31e40 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
31e50 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
31e60 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
31e70 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
31e80 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
31e90 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
31ea0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
31eb0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
31ec0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
31ed0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
31ee0 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
31ef0 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
31f00 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
31f10 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
31f20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
31f30 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
31f40 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
31f50 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
31f60 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
31f70 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
31f80 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
31f90 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
31fa0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
31fb0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
31fc0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
31fd0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
31fe0 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
31ff0 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
32000 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
32010 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
32020 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
32030 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
32040 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
32050 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
32060 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
32070 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
32080 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
32090 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
320a0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
320b0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
320c0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
320d0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
320e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
320f0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
32100 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
32110 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
32120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
32130 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
32140 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
32150 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
32160 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
32170 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
32180 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
32190 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
321a0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
321b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
321c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
321d0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
321e0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
321f0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
32200 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
32210 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
32220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32230 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32240 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32250 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
32260 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
32270 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
32280 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
32290 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
322a0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
322b0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
322c0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
322d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
322e0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
322f0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
32300 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
32310 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
32320 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
32330 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
32340 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
32350 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
32360 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
32370 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
32380 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32390 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
323a0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
323b0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
323c0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
323d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
323e0 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
323f0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
32400 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
32410 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
32420 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
32430 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
32440 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32470 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
32480 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32490 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
324a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
324b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
324c0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
324d0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
324e0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
324f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32500 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
32510 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
32520 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
32530 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
32540 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
32550 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
32560 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
32570 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
32580 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
32590 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
325a0 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
325b0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
325c0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
325d0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
325e0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
325f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32600 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32610 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
32620 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32640 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
32650 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
32660 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
32670 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
32680 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
32690 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
326a0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
326b0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
326c0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
326d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
326e0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
326f0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
32700 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
32710 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
32720 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72  vTrunk);.  asser
32730 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
32740 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32750 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
32760 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
32770 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=1 );.  assert(
32780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32790 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  | (*ppPage)->isI
327a0 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  nit==0 );.  retu
327b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
327c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
327d0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
327e0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
327f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
32800 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
32810 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
32820 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
32830 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
32840 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
32850 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
32860 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
32870 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
32880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32890 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
328a0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
328b0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
328c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
328d0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
328e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
328f0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
32900 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
32910 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
32920 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
32930 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
32940 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
32950 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
32960 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
32970 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
32980 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
32990 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
329a0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
329b0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
329c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
329d0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
329e0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
329f0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
32a00 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
32a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
32a20 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
32a30 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
32a40 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
32a50 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
32a60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32a70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32a80 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
32a90 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
32aa0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
32ab0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
32ac0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
32ad0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
32ae0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
32af0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
32b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32b10 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
32b20 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
32b30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32b60 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
32b70 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b90 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
32ba0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
32bb0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
32bc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32bd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
32be0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
32bf0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
32c00 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  | iPage>1 );.  a
32c10 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
32c20 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
32c30 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
32c40 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65  if( iPage<2 ) re
32c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
32c60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
32c70 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
32c80 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
32c90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
32ca0 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
32cb0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
32cc0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
32cd0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
32ce0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
32cf0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
32d00 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
32d10 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
32d20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32d30 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
32d40 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
32d50 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
32d60 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
32d70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32d80 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
32d90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32da0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
32db0 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
32dc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32dd0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
32de0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
32df0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
32e00 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
32e10 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
32e20 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
32e30 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
32e40 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
32e50 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
32e60 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
32e70 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
32e80 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
32e90 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
32ea0 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
32eb0 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
32ec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
32ed0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
32ee0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
32ef0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32f00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
32f10 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
32f20 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
32f30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
32f40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
32f50 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
32f60 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
32f70 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
32f80 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
32f90 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
32fa0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
32fb0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
32fc0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
32fd0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
32fe0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
32ff0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
33000 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
33010 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
33020 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
33030 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
33040 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
33050 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
33060 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
33070 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
33080 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
33090 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
330a0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
330b0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
330c0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
330d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
330e0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
330f0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
33100 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
33110 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
33120 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
33130 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
33140 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
33150 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
33160 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
33170 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
33180 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
33190 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
331a0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
331b0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
331c0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
331d0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
331e0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
331f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
33200 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
33210 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
33220 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
33230 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
33240 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
33250 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
33260 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
33270 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
33280 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
33290 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
332a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
332b0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
332c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
332d0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
332e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
332f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
33300 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
33310 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
33320 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
33330 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
33340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
33350 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33360 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
33370 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33380 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
33390 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
333a0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
333b0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
333c0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
333d0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
333e0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
333f0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
33400 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
33410 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
33420 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
33430 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
33440 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
33450 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
33460 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
33470 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
33480 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
33490 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
334a0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
334b0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
334c0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
334d0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
334e0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
334f0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
33500 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
33510 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
33520 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
33530 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
33540 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
33550 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
33560 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
33570 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
33580 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
33590 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
335a0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
335b0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
335c0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
335d0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
335e0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
335f0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
33600 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
33610 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
33620 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
33630 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
33640 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
33650 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
33660 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
33670 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
33680 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
33690 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
336a0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
336b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
336c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
336d0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
336e0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
336f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
33700 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33710 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
33720 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
33730 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
33740 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
33750 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
33760 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
33770 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
33780 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
33790 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
337a0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
337b0 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
337c0 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
337d0 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
337e0 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
337f0 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
33800 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
33810 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
33820 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33830 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33840 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
33850 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
33860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
33880 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
33890 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
338a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
338b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
338c0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
338d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
338e0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
338f0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
33900 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
33910 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33920 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
33930 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
33940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33950 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
33960 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
33970 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
33980 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
33990 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
339a0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
339b0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
339c0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
339d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
339e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
339f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
33a00 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
33a10 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
33a20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
33a30 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
33a40 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
33a50 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
33a60 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
33a70 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
33a80 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
33a90 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
33aa0 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
33ab0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
33ac0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
33ad0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
33ae0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
33af0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
33b00 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
33b10 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
33b20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
33b30 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
33b40 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
33b50 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
33b60 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
33b70 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
33b80 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
33b90 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
33ba0 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
33bb0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33bc0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
33bd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33be0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
33bf0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
33c10 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
33c20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
33c30 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
33c40 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
33c50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
33c60 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
33c70 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33c80 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
33c90 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
33ca0 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
33cb0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
33cc0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
33cd0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
33ce0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
33cf0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
33d00 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
33d10 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
33d20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
33d30 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
33d40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
33d50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
33d60 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
33d70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
33d80 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
33d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33da0 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
33db0 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
33dc0 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
33dd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
33de0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
33df0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
33e00 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
33e10 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68   Cell.  Write th
33e20 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20  e.** local Cell 
33e30 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72  size (the number
33e40 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65   of bytes on the
33e50 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20   original page, 
33e60 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72  omitting.** over
33e70 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69  flow) into *pnSi
33e80 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
33e90 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
33ea0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
33eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
33ec0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
33ed0 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
33ee0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33ef0 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
33f00 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
33f10 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
33f20 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
33f30 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61   /* Size informa
33f40 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
33f50 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ell */.){.  BtSh
33f60 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
33f70 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
33f80 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
33f90 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
33fa0 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
33fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33fc0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
33fd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
33fe0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
33ff0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
34000 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  fo);.  if( pInfo
34010 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d  ->nLocal==pInfo-
34020 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  >nPayload ){.   
34030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34040 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
34050 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
34060 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
34070 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
34080 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f   if( pCell+pInfo
34090 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67  ->nSize-1 > pPag
340a0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
340b0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
340c0 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
340d0 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
340e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
340f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
34100 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
34110 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
34120 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
34130 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   + pInfo->nSize 
34140 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  - 4);.  pBt = pP
34150 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
34160 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
34170 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
34180 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
34190 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
341a0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66  .  nOvfl = (pInf
341b0 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49  o->nPayload - pI
341c0 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  nfo->nLocal + ov
341d0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
341e0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
341f0 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
34200 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
34210 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e  _DB && (pInfo->n
34220 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
34230 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
34240 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
34250 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
34260 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
34270 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
34280 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
34290 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
342a0 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
342b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
342c0 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
342d0 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
342e0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
342f0 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
34300 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
34310 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
34320 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
34330 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
34340 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
34350 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
34360 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
34370 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
34380 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34390 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
343a0 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
343b0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
343c0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
343d0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
343e0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
343f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34400 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
34410 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
34420 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
34430 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
34440 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
34450 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
34460 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
34470 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
34480 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
34490 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
344a0 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
344b0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
344c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
344d0 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
344e0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
344f0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
34500 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
34510 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
34520 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
34530 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
34540 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
34550 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
34560 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
34570 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
34580 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
34590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
345a0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
345b0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
345c0 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
345d0 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
345e0 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
345f0 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
34600 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
34610 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
34620 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
34630 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
34640 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
34650 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
34660 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
34670 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
34680 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
34690 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
346a0 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
346b0 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
346c0 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
346d0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
346e0 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
346f0 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
34700 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
34710 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34720 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
34730 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
34740 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
34750 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
34760 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
34770 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
34780 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
34790 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
347a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
347b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
347c0 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
347d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
347e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
347f0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
34800 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
34810 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
34820 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
34830 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
34840 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
34850 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
34860 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
34870 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
34880 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
34890 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
348a0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
348b0 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
348c0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
348d0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
348e0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
348f0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
34900 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
34910 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
34920 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
34930 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
34940 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
34950 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
34960 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
34970 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
34980 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
34990 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
349a0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
349b0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
349c0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
349d0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
349e0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
349f0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
34a00 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
34a10 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
34a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
34a30 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
34a40 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
34a50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
34a60 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
34a70 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
34a80 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
34a90 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f  const BtreePaylo
34aa0 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f  ad *pX,        /
34ab0 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77  * Payload with w
34ac0 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
34ad0 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  t the cell */.  
34ae0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b00 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
34b10 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
34b20 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
34b30 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
34b40 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
34b50 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
34b60 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
34b70 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
34b80 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
34b90 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
34ba0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
34bb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
34bc0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
34bd0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
34be0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
34bf0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
34c00 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
34c10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
34c20 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
34c30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
34c40 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
34c50 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
34c60 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
34c70 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
34c80 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
34c90 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
34ca0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
34cb0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
34cc0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
34cd0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
34ce0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
34cf0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
34d00 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
34d10 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
34d20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34d30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34d40 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
34d50 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
34d60 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
34d70 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
34d80 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  e;.  if( pPage->
34d90 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
34da0 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61  ayload = pX->nDa
34db0 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a  ta + pX->nZero;.
34dc0 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
34dd0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
34de0 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20   pX->nData;.    
34df0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
34e00 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20  ntKeyLeaf ); /* 
34e10 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
34e20 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61  y called for lea
34e30 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64  ves */.    nHead
34e40 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
34e50 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
34e60 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
34e70 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
34e80 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
34e90 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
34ea0 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  pX->nKey);.  }el
34eb0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
34ec0 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66  pX->nKey<=0x7fff
34ed0 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79  ffff && pX->pKey
34ee0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20  !=0 );.    nSrc 
34ef0 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e  = nPayload = (in
34f00 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  t)pX->nKey;.    
34f10 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b  pSrc = pX->pKey;
34f20 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
34f30 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
34f40 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
34f50 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20  yload);.  }.  . 
34f60 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
34f70 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28  payload */.  if(
34f80 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
34f90 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
34fa0 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
34fb0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
34fc0 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
34fd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34fe0 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
34ff0 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
35000 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
35010 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79  spaceLeft = nPay
35020 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72  load;.    pPrior
35030 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73   = pCell;.  }els
35040 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20  e{.    int mn = 
35050 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
35060 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e  .    n = mn + (n
35070 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20  Payload - mn) % 
35080 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
35090 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
350a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
350b0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
350c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
350d0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
350e0 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
350f0 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
35100 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
35110 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
35120 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
35130 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a   + nHeader + 4;.
35140 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43      pPrior = &pC
35150 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
35160 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d    }.  pPayload =
35170 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
35180 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
35190 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
351a0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
351b0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
351c0 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
351d0 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
351e0 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
351f0 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
35200 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
35210 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
35220 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
35230 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
35240 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
35250 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
35260 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
35270 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35290 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
352a0 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
352b0 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
352c0 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
352d0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
352e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
352f0 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
35300 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
35310 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
35320 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
35330 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
35340 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
35350 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
35360 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
35370 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
35380 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
35390 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
353a0 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
353b0 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
353c0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
353d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
353e0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
353f0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
35400 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
35410 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
35420 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
35430 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
35440 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
35450 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
35460 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
35470 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a  ey==pX->nKey );.
35480 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
35490 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
354a0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
354b0 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
354c0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d  fo.nLocal );.  }
354d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
354e0 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
354f0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
35500 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
35510 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
35520 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
35530 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
35540 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
35550 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
35560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35570 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
35580 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
35590 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
355a0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
355b0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
355c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
355d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
355e0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
355f0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
35600 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
35610 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
35620 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
35630 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
35640 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
35650 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
35660 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
35670 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
35680 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
35690 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
356a0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
356b0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
356c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
356d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
356e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
356f0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
35700 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
35710 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
35720 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
35730 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
35740 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
35750 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
35760 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
35770 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
35780 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
35790 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
357a0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
357b0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
357c0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
357d0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
357e0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
357f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
35800 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
35810 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
35820 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
35830 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
35840 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
35850 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
35860 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
35870 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
35880 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
35890 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
358a0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
358b0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
358c0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
358d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
358e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
358f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35900 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
35910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
35920 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
35930 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
35940 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
35950 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
35960 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
35970 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
35980 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
35990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
359a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
359b0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
359c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
359d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
359e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
359f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35a00 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
35a10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35a20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
35a30 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
35a40 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
35a50 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
35a60 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
35a70 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
35a80 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
35a90 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
35aa0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
35ab0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
35ac0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
35ad0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
35ae0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
35af0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
35b00 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
35b10 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
35b20 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
35b30 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
35b40 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
35b50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
35b60 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
35b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
35b80 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
35b90 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
35ba0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
35bb0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
35bc0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
35bd0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35be0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35bf0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
35c00 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
35c10 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
35c20 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
35c30 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
35c40 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
35c50 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
35c60 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
35c70 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
35c80 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
35c90 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
35ca0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
35cb0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
35cc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
35cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
35ce0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
35cf0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
35d00 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
35d10 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
35d20 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
35d30 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
35d40 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
35d50 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
35d60 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
35d70 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
35d80 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
35d90 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
35da0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
35db0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
35dc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35dd0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
35de0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
35df0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
35e00 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
35e10 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
35e20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
35e30 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
35e40 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
35e50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
35e60 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
35e70 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
35e80 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
35e90 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
35ea0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
35eb0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
35ec0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
35ed0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
35ee0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
35ef0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
35f00 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
35f10 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
35f20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
35f30 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
35f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35f50 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
35f60 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
35f70 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
35f80 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
35f90 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
35fa0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
35fb0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
35fc0 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  -= n;.  }.  rele
35fd0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
35fe0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
35ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
36000 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
36010 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
36020 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36030 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
36040 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
36050 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
36060 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
36070 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
36080 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
36090 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
360a0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
360b0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
360c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
360d0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
360e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
360f0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
36100 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
36110 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
36120 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
36130 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
36140 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
36150 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
36160 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
36170 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
36180 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
36190 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
361a0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
361b0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
361c0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
361d0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
361e0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
361f0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
36200 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
36210 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
36220 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
36240 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
36250 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
36260 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
36270 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
36280 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
36290 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
362a0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
362b0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
362c0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
362d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
362e0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a  CORRUPT_DB || sz
362f0 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
36300 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
36310 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36320 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36330 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
36340 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36350 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
36360 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
36370 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
36380 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
36390 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
363a0 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
363b0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
363c0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
363d0 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
363e0 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
363f0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
36400 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
36410 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
36420 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36430 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32  .  if( pc < (u32
36440 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  )get2byte(&data[
36450 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
36460 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
36470 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
36480 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
36490 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
364a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
364b0 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
364c0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
364d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
364e0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
364f0 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  urn;.  }.  pPage
36500 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28  ->nCell--;.  if(
36510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
36520 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
36530 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
36540 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  4);.    data[hdr
36550 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74  +7] = 0;.    put
36560 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
36570 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  5], pPage->pBt->
36580 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
36590 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
365a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
365b0 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e  leSize - pPage->
365c0 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20  hdrOffset.      
365d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365e0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
365f0 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65  trSize - 8;.  }e
36600 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  lse{.    memmove
36610 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28  (ptr, ptr+2, 2*(
36620 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69  pPage->nCell - i
36630 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79  dx));.    put2by
36640 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
36650 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
36660 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
36670 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   += 2;.  }.}../*
36680 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
36690 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
366a0 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
366b0 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
366c0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
366d0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
366e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
366f0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
36700 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
36710 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
36720 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
36730 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
36740 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
36750 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
36760 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
36770 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
36780 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
36790 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
367a0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
367b0 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66   in pPage->apOvf
367c0 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
367d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
367e0 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
367f0 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
36800 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
36810 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
36820 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
36830 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
36840 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
36850 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
36860 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
36870 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
36880 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
36890 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62  *.** *pRC must b
368a0 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  e SQLITE_OK when
368b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
368c0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
368d0 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
368e0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
368f0 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
36900 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
36910 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
36920 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
36930 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
36940 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
36950 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
36960 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
36970 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
36980 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
36990 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
369a0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
369b0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
369c0 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
369d0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
369e0 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
369f0 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
36a00 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
36a10 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
36a20 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
36a30 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
36a40 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
36a50 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
36a60 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
36a70 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
36a80 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
36a90 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
36aa0 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
36ab0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
36ac0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
36ad0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
36ae0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
36af0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
36b00 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
36b10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
36b20 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
36b30 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
36b40 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20   *pIns;         
36b50 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20  /* The point in 
36b60 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
36b70 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20  ] where no cell 
36b80 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61  inserted */..  a
36b90 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c  ssert( *pRC==SQL
36ba0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
36bb0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
36bc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
36bd0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
36be0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
36bf0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
36c00 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
36c10 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
36c20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
36c30 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
36c40 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
36c50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
36c60 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
36c70 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
36c80 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
36c90 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
36ca0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
36cb0 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
36cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
36cd0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36ce0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
36cf0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
36d00 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
36d10 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
36d20 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
36d30 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
36d40 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
36d50 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
36d60 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
36d70 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
36d80 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
36d90 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
36da0 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
36db0 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
36dc0 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
36dd0 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
36de0 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
36df0 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
36e00 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
36e10 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
36e20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
36e30 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
36e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36e50 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
36e60 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65  ( sz==pPage->xCe
36e70 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43  llSize(pPage, pC
36e80 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
36e90 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
36ea0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
36eb0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
36ec0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
36ed0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
36ee0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
36ef0 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
36f00 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
36f10 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
36f20 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
36f30 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
36f40 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
36f50 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
36f60 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
36f70 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61   /* Comparison a
36f80 67 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65  gainst ArraySize
36f90 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64  -1 since we hold
36fa0 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20   back one extra 
36fb0 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61  slot.    ** as a
36fc0 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49   contingency.  I
36fd0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e  n other words, n
36fe0 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74  ever need more t
36ff0 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20  han 3 overflow. 
37000 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20     ** slots but 
37010 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  4 are allocated,
37020 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
37030 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
37040 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70   j < ArraySize(p
37050 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20  Page->apOvfl)-1 
37060 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70  );.    pPage->ap
37070 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b  Ovfl[j] = pCell;
37080 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76  .    pPage->aiOv
37090 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a  fl[j] = (u16)i;.
370a0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c  .    /* When mul
370b0 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20  tiple overflows 
370c0 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20  occur, they are 
370d0 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61  always sequentia
370e0 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20  l and in.    ** 
370f0 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54  sorted order.  T
37100 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61  his invariants a
37110 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c  rise because mul
37120 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20  tiple overflows 
37130 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  can.    ** only 
37140 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72  occur when inser
37150 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c  ting divider cel
37160 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
37170 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20  nt page during. 
37180 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c     ** balancing,
37190 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
371a0 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61  s are adjacent a
371b0 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a  nd sorted..    *
371c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
371d0 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f  =0 || pPage->aiO
371e0 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20  vfl[j-1]<(u16)i 
371f0 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20  ); /* Overflows 
37200 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
37210 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
37220 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d  ==0 || i==pPage-
37230 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29  >aiOvfl[j-1]+1 )
37240 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73  ;   /* Overflows
37250 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20   are sequential 
37260 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
37270 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
37280 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
37290 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
372a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
372b0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
372c0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
372d0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
372e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
372f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37300 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
37310 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
37320 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73  e->aData;.    as
37330 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67  sert( &data[pPag
37340 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d  e->cellOffset]==
37350 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
37360 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  );.    rc = allo
37370 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
37380 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20   sz, &idx);.    
37390 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d  if( rc ){ *pRC =
373a0 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20   rc; return; }. 
373b0 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61     /* The alloca
373c0 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  teSpace() routin
373d0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65  e guarantees the
373e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65   following prope
373f0 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
37400 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
37410 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61  ssfully */.    a
37420 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20  ssert( idx >= 0 
37430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
37440 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c  dx >= pPage->cel
37450 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
37460 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52  >nCell+2 || CORR
37470 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73  UPT_DB );.    as
37480 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
37490 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
374a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
374b0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
374c0 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
374d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
374e0 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20  ta[idx], pCell, 
374f0 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  sz);.    if( iCh
37500 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
37510 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
37520 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
37530 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67  .    pIns = pPag
37540 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a  e->aCellIdx + i*
37550 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  2;.    memmove(p
37560 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28  Ins+2, pIns, 2*(
37570 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69  pPage->nCell - i
37580 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
37590 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20  (pIns, idx);.   
375a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
375b0 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e  .    /* incremen
375c0 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  t the cell count
375d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64   */.    if( (++d
375e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
375f0 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61  fset+4])==0 ) da
37600 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
37610 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73  set+3]++;.    as
37620 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
37630 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
37640 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65  ffset+3])==pPage
37650 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64  ->nCell );.#ifnd
37660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
37670 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
37680 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
37690 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
376a0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
376b0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
376c0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
376d0 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
376e0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
376f0 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
37700 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
37710 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
37720 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
37730 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
37740 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
37750 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23  l, pRC);.    }.#
37760 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
37770 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f  ** A CellArray o
37780 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
37790 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65   cache of pointe
377a0 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72  rs and sizes for
377b0 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76   a.** consecutiv
377c0 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65  e sequence of ce
377d0 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62  lls that might b
377e0 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70  e held on multip
377f0 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70  le pages..*/.typ
37800 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c  edef struct Cell
37810 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b  Array CellArray;
37820 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61  .struct CellArra
37830 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  y {.  int nCell;
37840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37850 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
37860 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
37870 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b    MemPage *pRef;
37880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
37890 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20  erence page */. 
378a0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
378b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
378c0 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
378d0 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
378e0 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
378f0 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
37900 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
37910 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  apCell[] */.};..
37920 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
37930 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61  the cell sizes a
37940 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e  t idx, idx+1, ..
37950 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20  ., idx+N-1 have 
37960 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64  been.** computed
37970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37980 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63   populateCellCac
37990 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  he(CellArray *p,
379a0 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29   int idx, int N)
379b0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  {.  assert( idx>
379c0 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e  =0 && idx+N<=p->
379d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65  nCell );.  while
379e0 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ( N>0 ){.    ass
379f0 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  ert( p->apCell[i
37a00 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  dx]!=0 );.    if
37a10 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d  ( p->szCell[idx]
37a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
37a30 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d  szCell[idx] = p-
37a40 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
37a50 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
37a60 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d  ell[idx]);.    }
37a70 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
37a80 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
37a90 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
37aa0 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
37ab0 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
37ac0 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
37ad0 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20  pCell[idx]) );. 
37ae0 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a     }.    idx++;.
37af0 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a      N--;.  }.}..
37b00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
37b10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68   size of the Nth
37b20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
37b30 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74  cell array.*/.st
37b40 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
37b50 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65  LINE u16 compute
37b60 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
37b70 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
37b80 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
37b90 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
37ba0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65   assert( p->szCe
37bb0 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d  ll[N]==0 );.  p-
37bc0 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e  >szCell[N] = p->
37bd0 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
37be0 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
37bf0 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ll[N]);.  return
37c00 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d   p->szCell[N];.}
37c10 0a 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68  .static u16 cach
37c20 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41  edCellSize(CellA
37c30 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  rray *p, int N){
37c40 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20  .  assert( N>=0 
37c50 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b  && N<p->nCell );
37c60 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c  .  if( p->szCell
37c70 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e  [N] ) return p->
37c80 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74  szCell[N];.  ret
37c90 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53  urn computeCellS
37ca0 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a  ize(p, N);.}../*
37cb0 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
37cc0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  [] contains poin
37cd0 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d  ters to nCell b-
37ce0 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e  tree page cells.
37cf0 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b   The .** szCell[
37d00 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
37d10 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37d20 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e  es of each cell.
37d30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
37d40 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63  * replaces the c
37d50 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
37d60 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68  of page pPg with
37d70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37d80 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72   the cell.** arr
37d90 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f  ay..**.** Some o
37da0 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61  f the cells in a
37db0 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72  pCell[] may curr
37dc0 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
37dd0 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20  in pPg. This.** 
37de0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61  function works a
37df0 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
37e00 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79  aused by this by
37e10 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f   making a copy o
37e20 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63  f any .** such c
37e30 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72  ells before over
37e40 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65  writing the page
37e50 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   data..**.** The
37e60 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66   MemPage.nFree f
37e70 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61  ield is invalida
37e80 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
37e90 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20  tion. It is the 
37ea0 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
37eb0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
37ec0 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65   to set it corre
37ed0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
37ee0 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28  int rebuildPage(
37ef0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
37f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f10 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20     /* Edit this 
37f20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  page */.  int nC
37f30 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
37f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
37f50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
37f60 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ls on page */.  
37f70 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
37f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f90 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
37fa0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  s */.  u16 *szCe
37fb0 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
37fc0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37fd0 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f  of cell sizes */
37fe0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
37ff0 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
38000 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  fset;          /
38010 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
38020 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75  er on pPg */.  u
38030 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
38040 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20  = pPg->aData;   
38050 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
38060 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
38070 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  Pg */.  const in
38080 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
38090 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
380a0 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ize;.  u8 * cons
380b0 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
380c0 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69  usableSize];.  i
380d0 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c  nt i;.  u8 *pCel
380e0 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c  lptr = pPg->aCel
380f0 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70  lIdx;.  u8 *pTmp
38100 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
38110 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42  empSpace(pPg->pB
38120 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38  t->pPager);.  u8
38130 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20   *pData;..  i = 
38140 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
38150 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
38160 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61  y(&pTmp[i], &aDa
38170 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a  ta[i], usableSiz
38180 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61  e - i);..  pData
38190 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69   = pEnd;.  for(i
381a0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
381b0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
381c0 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20   = apCell[i];.  
381d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
381e0 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c  HIN(pCell,aData,
381f0 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70  pEnd) ){.      p
38200 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
38210 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
38220 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20   }.    pData -= 
38230 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70  szCell[i];.    p
38240 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
38250 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61  , (pData - aData
38260 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
38270 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70   += 2;.    if( p
38280 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20  Data < pCellptr 
38290 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
382a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
382b0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
382c0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d  pCell, szCell[i]
382d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
382e0 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78  zCell[i]==pPg->x
382f0 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43  CellSize(pPg, pC
38300 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
38310 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  DB );.    testca
38320 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70  se( szCell[i]!=p
38330 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  Pg->xCellSize(pP
38340 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a  g,pCell) );.  }.
38350 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e  .  /* The pPg->n
38360 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f  Free field is no
38370 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  w set incorrectl
38380 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  y. The caller wi
38390 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20  ll fix it. */.  
383a0 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  pPg->nCell = nCe
383b0 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72  ll;.  pPg->nOver
383c0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74  flow = 0;..  put
383d0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
383e0 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62  +1], 0);.  put2b
383f0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
38400 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
38410 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
38420 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
38430 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74  - aData);.  aDat
38440 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b  a[hdr+7] = 0x00;
38450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
38460 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41