/ Hex Artifact Content
Login

Artifact defa7525774e74977aaed98242160002fbeecaf96e4f8da7911a1f43c3a16754:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20  Pgno pgnoRoot,  
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
4300: 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20  able that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4340: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4350: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4360: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4370: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4380: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
4390: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
43a0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
43b0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
43c0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
43d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
43e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
43f0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4400: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4410: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4420: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4430: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4440: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4450: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4460: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4470: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4480: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
4490: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
44a0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
44b0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f  ->pgnoRoot==pgno
44c0: 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72  Root && (isClear
44d0: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
44e0: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a  .nKey==iRow) ){.
44f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4500: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
4510: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
4520: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4530: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4540: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4550: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4560: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4570: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4580: 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  s(w,x,y,z).#endi
4590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
45a0: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
45b0: 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f  .** Set bit pgno
45c0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
45d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
45e0: 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c  vec. This is cal
45f0: 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70  led .** when a p
4600: 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75  age that previou
4610: 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61  sly contained da
4620: 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ta becomes a fre
4630: 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20  e-list leaf .** 
4640: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
4650: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4660: 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73  tent bitvec exis
4670: 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ts to work aroun
4680: 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20  d an obscure.** 
4690: 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68  bug caused by th
46a0: 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66  e interaction of
46b0: 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f   two useful IO o
46c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72  ptimizations sur
46d0: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65  rounding.** free
46e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
46f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
4700: 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65  n all data is de
4710: 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67  leted from a pag
4720: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  e and the page b
4730: 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61  ecomes.**      a
4740: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4750: 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69  page, the page i
4760: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
4770: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
4780: 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c        (as free-l
4790: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63  ist leaf pages c
47a0: 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e  ontain no meanin
47b0: 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65  gful data). Some
47c0: 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75  times.**      su
47d0: 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74  ch a page is not
47e0: 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64   even journalled
47f0: 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74   (as it will not
4800: 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   be modified,.**
4810: 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72        why bother
4820: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f   journalling it?
4830: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  )..**.**   2) Wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73  eaf page is reus
4860: 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ed, its content 
4870: 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20  is not read.**  
4880: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74      from the dat
4890: 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e  abase or written
48a0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
48b0: 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64  file (why should
48c0: 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20   it.**      be, 
48d0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
48e0: 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29  all meaningful?)
48f0: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73  ..**.** By thems
4900: 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74  elves, these opt
4910: 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20  imizations work 
4920: 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65  fine and provide
4930: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
4940: 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f  ormance boost to
4950: 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20   bulk delete or 
4960: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
4970: 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a  s. However, if.*
4980: 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  * a page is move
4990: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
49a0: 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73  st and then reus
49b0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ed within the sa
49c0: 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  me.** transactio
49d0: 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d  n, a problem com
49e0: 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61  es up. If the pa
49f0: 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61  ge is not journa
4a00: 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20  lled when.** it 
4a10: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4a20: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74  free-list and it
4a30: 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75   is also not jou
4a40: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a  rnalled when it.
4a50: 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ** is extracted 
4a60: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4a70: 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74  st and reused, t
4a80: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
4a90: 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20   data.** may be 
4aa0: 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65  lost. In the eve
4ab0: 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
4ac0: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
4ad0: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72  possible.** to r
4ae0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4af0: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
4b00: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
4b10: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c  n..**.** The sol
4b20: 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53  ution is the BtS
4b30: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4b40: 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  t bitvec. Whenev
4b50: 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a  er a page is .**
4b60: 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65   moved to become
4b70: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4b80: 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72  f page, the corr
4b90: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
4ba0: 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62  .** set in the b
4bb0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4bc0: 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65  a leaf page is e
4bd0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
4be0: 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20  e free-list,.** 
4bf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61  optimization 2 a
4c00: 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20  bove is omitted 
4c10: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4c20: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4c30: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4c40: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4c50: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4c60: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4c70: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4c80: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
4c90: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
4ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4cb0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
4cc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4cd0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
4ce0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4cf0: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4d00: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4d10: 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42  assert( pgno<=pB
4d20: 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  t->nPage );.    
4d30: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4d50: 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67  Create(pBt->nPag
4d60: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74  e);.    if( !pBt
4d70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4d90: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
4da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
4db0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4dc0: 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74  pgno<=sqlite3Bit
4dd0: 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61  vecSize(pBt->pHa
4de0: 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20  sContent) ){.   
4df0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
4e00: 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73  vecSet(pBt->pHas
4e10: 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a  Content, pgno);.
4e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
4e40: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e50: 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e  sContent vector.
4e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4e70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
4e80: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
4e90: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d  leaf page is rem
4ea0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  oved from the.**
4eb0: 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72   free-list for r
4ec0: 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  euse. It returns
4ed0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
4ee0: 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65  safe to retrieve
4ef0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f   the.** page fro
4f00: 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
4f10: 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
4f20: 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
4f30: 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65  . True otherwise
4f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f50: 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
4f60: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4f70: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4f80: 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d  Bitvec *p = pBt-
4f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20  >pHasContent;.  
4fa0: 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67  return (p && (pg
4fb0: 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63  no>sqlite3Bitvec
4fc0: 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74  Size(p) || sqlit
4fd0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20  e3BitvecTest(p, 
4fe0: 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pgno)));.}../*.*
4ff0: 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79  * Clear (destroy
5000: 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  ) the BtShared.p
5010: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
5020: 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  c. This should b
5030: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20  e.** invoked at 
5040: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
5050: 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61  f each write-tra
5060: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
5070: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c  tic void btreeCl
5080: 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  earHasContent(Bt
5090: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
50a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
50b0: 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f  troy(pBt->pHasCo
50c0: 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70  ntent);.  pBt->p
50d0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a  HasContent = 0;.
50e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
50f0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61   all of the apPa
5100: 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61  ge[] pages for a
5110: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
5120: 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c  ic void btreeRel
5130: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5140: 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  es(BtCursor *pCu
5150: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
5170: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
5180: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
5190: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
51a0: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
51b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  [i] = 0;.  }.  p
51c0: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
51d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
51e0: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
51f0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5200: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5210: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5220: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
5230: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
5240: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
5250: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
5260: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5270: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
5280: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5290: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
52a0: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
52b0: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
52c0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
52d0: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
52e0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
52f0: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5300: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5310: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5320: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
5330: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
5340: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
5350: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
5360: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
5370: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
5380: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5390: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
53a0: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
53b0: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
53c0: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
53d0: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
53e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
53f0: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5400: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5410: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5420: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
5430: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
5440: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
5450: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5470: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
5480: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5490: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
54a0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
54b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
54c0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
54d0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
54e0: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
54f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5500: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5510: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5520: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5530: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5540: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5550: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5560: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5570: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5580: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5590: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
55a0: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
55b0: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
55c0: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
55d0: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
55e0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
55f0: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5600: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5610: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5620: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5630: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5640: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5650: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5670: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5680: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
56a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
56b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
56c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
56d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
56e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
56f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5700: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5710: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5720: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5730: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5740: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5750: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5760: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5770: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5780: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5790: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
57a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
57b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
57c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
57d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
57e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
57f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5800: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5810: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5820: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5830: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5840: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5850: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5860: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5870: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5880: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5890: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
58a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
58b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
58c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
58d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
58e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
58f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5900: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5910: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5920: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5930: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5940: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5950: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5960: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5970: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5980: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5990: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
59a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
59b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
59c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
59d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
59e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
59f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5a00: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5a10: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5a20: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5a30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5a40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5a50: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5a60: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5a70: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5a80: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5a90: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5aa0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5ab0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5ac0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5ad0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5ae0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5af0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5b00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5b10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5b20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5b30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5b40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5b50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5b60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5b70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5b80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5b90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5ba0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5bb0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5bc0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5bd0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5be0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5bf0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5c00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5c10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5c20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5c30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5c40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5c50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5c60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5c70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5c80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5c90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ca0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5cb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5cc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5cd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5ce0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5cf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5d00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5d10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5d20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5d30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5d40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5d50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5d60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5d70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5d80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5d90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5da0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5db0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5dc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5dd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5de0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5df0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5e00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5e10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5e20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5e40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5e50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5e60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5e70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5e80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5e90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5ea0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5eb0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5ec0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5ed0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5ef0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5f00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5f10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5f20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5f30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5f40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5f50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5f60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5f70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5f80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5f90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5fa0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5fb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5fc0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5fd0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5fe0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ff0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6000: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6010: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6020: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
6030: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
6040: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
6050: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
6060: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
6070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6080: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6090: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
60a0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
60b0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
60c0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
60d0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
60e0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
60f0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6100: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6110: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6120: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6130: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6140: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6160: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6170: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6180: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6190: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
61a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
61b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
61c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
61d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
61e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
61f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6200: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6210: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6220: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6230: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6240: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6250: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6260: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6270: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6280: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6290: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
62a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
62b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
62c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
62d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
62e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6310: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6320: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6330: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6340: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6350: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6360: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6370: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
63a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
63b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
63c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
63d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
63e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
63f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6400: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6420: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6430: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6440: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6450: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6460: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6470: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6480: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6490: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
64a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
64b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
64c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
64d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
64e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
64f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6500: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6510: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6520: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6530: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6540: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6550: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6560: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6570: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6580: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6590: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
65a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
65b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
65c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
65d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
65e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
65f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6600: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6610: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6620: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6630: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6640: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6650: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6670: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6680: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6690: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
66a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
66b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
66c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
66d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
66e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
66f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6700: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6740: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6750: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6760: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6770: 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20  x key */..  if( 
6780: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
6790: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
67a0: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
67b0: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
67c0: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
67d0: 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70  edRecord(pCur->p
67e0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
67f0: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
6800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c  EM_BKPT;.    sql
6820: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
6830: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
6840: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
6850: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
6860: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
6870: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
6880: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6890: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
68a0: 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
68b0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  done;.    }.  }e
68c0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
68d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
68e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
68f0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
6900: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
6910: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f   bias, pRes);.mo
6920: 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28  veto_done:.  if(
6930: 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
6940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6950: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6960: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
6970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6980: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6990: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
69a0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
69b0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
69c0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
69d0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
69e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
69f0: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6a00: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6a10: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6a20: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6a30: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6a40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6a50: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6a60: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6a70: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6a80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a90: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
6aa0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
6ab0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
6ac0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
6ad0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6ae0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
6af0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
6b00: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
6b10: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6b20: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
6b30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
6b40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
6b50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6b60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
6b70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
6b80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
6b90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
6ba0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
6bb0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6bc0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
6bd0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
6be0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
6bf0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69  r->nKey, 0, &ski
6c00: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
6c10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6c20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6c30: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
6c40: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6c50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
6c60: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c70: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
6c80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6c90: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70  INVALID );.    p
6ca0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d  Cur->skipNext |=
6cb0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
6cc0: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
6cd0: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
6ce0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
6cf0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
6d00: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
6d10: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
6d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6d30: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
6d40: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d50: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
6d60: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6d70: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
6d80: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
6d90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
6da0: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
6db0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
6dc0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
6dd0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
6de0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
6df0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
6e00: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
6e10: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
6e20: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
6e30: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
6e40: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
6e50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
6e60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
6e70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
6e80: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
6e90: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
6ea0: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
6eb0: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
6ec0: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
6ed0: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
6ee0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
6ef0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
6f00: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
6f10: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
6f20: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
6f30: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
6f40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f50: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
6f60: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
6f70: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
6f80: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
6f90: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
6fa0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6fb0: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
6fc0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6fd0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
6fe0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
6ff0: 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  rn pCur->eState!
7000: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7020: 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20  tine restores a 
7030: 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69  cursor back to i
7040: 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69  ts original posi
7050: 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a  tion after it.**
7060: 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20   has been moved 
7070: 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20  by some outside 
7080: 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61  activity (such a
7090: 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61  s a btree rebala
70a0: 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20  nce or.** a row 
70b0: 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65  having been dele
70c0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
70d0: 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20  er the cursor). 
70e0: 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65   .**.** On succe
70f0: 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72  ss, the *pDiffer
7100: 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72  entRow parameter
7110: 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
7120: 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a   cursor is left.
7130: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65  ** pointing at e
7140: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
7150: 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74  row.  *pDiffernt
7160: 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74  Row is the row t
7170: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
7180: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73   pointing to has
7190: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66   been deleted, f
71a0: 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f  orcing the curso
71b0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f  r to point to so
71c0: 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77  me.** nearby row
71d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
71e0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
71f0: 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   be called for a
7200: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73   cursor that jus
7210: 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52  t returned.** TR
7220: 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  UE from sqlite3B
7230: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7240: 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ed()..*/.int sql
7250: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
7260: 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20  estore(BtCursor 
7270: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66  *pCur, int *pDif
7280: 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e  ferentRow){.  in
7290: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
72a0: 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73   pCur!=0 );.  as
72b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
72c0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
72d0: 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
72e0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
72f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
7300: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
7310: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  entRow = 1;.    
7320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7330: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
7340: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7360: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c  ntRow = 1;.  }el
7370: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7380: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
7390: 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65  0 );.    *pDiffe
73a0: 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d  rentRow = 0;.  }
73b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
73c0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
73d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
73e0: 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
73f0: 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f  Provide hints to
7400: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
7410: 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e  e particular hin
7420: 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65  t given (and the
7430: 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d   type.** and num
7440: 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72  ber of the varar
7450: 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69  gs parameters) i
7460: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7470: 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a  the eHintType.**
7480: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65   parameter.  See
7490: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
74a0: 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49   of the BTREE_HI
74b0: 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20  NT_* macros for 
74c0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64  details..*/.void
74d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
74e0: 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72  sorHint(BtCursor
74f0: 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e   *pCur, int eHin
7500: 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f  tType, ...){.  /
7510: 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  * Used only by s
7520: 79 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74  ystem that subst
7530: 69 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20  itute their own 
7540: 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a  storage engine *
7550: 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.}.#endif../*.*
7560: 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68  * Provide flag h
7570: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
7580: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
7590: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
75a0: 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  ntFlags(BtCursor
75b0: 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64   *pCur, unsigned
75c0: 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78   x){.  assert( x
75d0: 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
75e0: 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b  || x==BTREE_BULK
75f0: 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a  LOAD || x==0 );.
7600: 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20    pCur->hints = 
7610: 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  x;.}...#ifndef S
7620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7630: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
7640: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
7650: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
7660: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
7670: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
7680: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
7690: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
76a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
76b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
76c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
76d0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
76e0: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
76f0: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
7700: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
7710: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
7720: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
7730: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
7740: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
7750: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
7760: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
7770: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
7780: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
7790: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
77a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
77b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
77c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
77d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
77e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
77f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7810: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
7820: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
7830: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
7840: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
7850: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
7860: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
7870: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
7880: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
7890: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
78a0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
78b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
78c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
78d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
78e0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
78f0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7900: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7910: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7920: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
7930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
7950: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
7960: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
7970: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
7980: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7990: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
79a0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
79b0: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
79c0: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
79d0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
79e0: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
79f0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7a00: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7a10: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7a20: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7a30: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7a40: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
7a50: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
7a60: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
7a70: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
7a80: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
7a90: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7ac0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7ad0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7ae0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7af0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7b00: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7b10: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7b20: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7b30: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7b40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
7b50: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
7b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7b70: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7b80: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
7b90: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
7ba0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7bc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7bd0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7be0: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7bf0: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7c00: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7c10: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7c20: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7c30: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7c40: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
7c50: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
7c60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
7c70: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
7c80: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
7c90: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
7ca0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7cb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7cc0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7cd0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7ce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7cf0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7d00: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7d10: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
7d20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7d30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
7d40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7d60: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7d70: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7d80: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7d90: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7da0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7db0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
7dc0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
7dd0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
7de0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
7df0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
7e00: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
7e10: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
7e20: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
7e30: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
7e40: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
7e50: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7e60: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7e70: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7e80: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7e90: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7ea0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7eb0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
7ec0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7ed0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
7ee0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ef0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7f00: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
7f10: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
7f20: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7f30: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
7f40: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
7f50: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
7f60: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7f70: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
7f80: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
7f90: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7fb0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
7fc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7fd0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
7fe0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
7ff0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8000: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8010: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8020: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
8030: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
8040: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8050: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
8060: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
8070: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
8080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8090: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
80a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
80b0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
80c0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
80d0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
80e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
80f0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
8100: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
8110: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8120: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
8130: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
8140: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8150: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
8160: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
8170: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
8180: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8190: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
81a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
81b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
81c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
81d0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
81e0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
81f0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
8200: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
8210: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
8220: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
8230: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8240: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8250: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
8260: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8270: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8280: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
8290: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
82a0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
82b0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
82c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
82d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
82e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
82f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8300: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
8310: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
8320: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
8330: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
8340: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
8350: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
8360: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
8370: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
8380: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8390: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
83a0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
83b0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
83c0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
83d0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
83e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
83f0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
8400: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8410: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8430: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8440: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8450: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8460: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8470: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8480: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8490: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
84a0: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
84b0: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
84c0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
84d0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
84e0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
84f0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
8500: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
8510: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
8520: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
8530: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8540: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
8550: 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73  *.** findCellPas
8560: 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20  tPtr() does the 
8570: 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73  same except it s
8580: 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e  kips past the in
8590: 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20  itial.** 4-byte 
85a0: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f  child pointer fo
85b0: 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20  und on interior 
85c0: 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20  pages, if there 
85d0: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  is one..**.** Th
85e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
85f0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
8600: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
8610: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
8620: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
8630: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
8640: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
8690: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
86a0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
86b0: 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29  aDataOfst + ((P)
86c0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
86d0: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
86e0: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
86f0: 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  )]))).../*.** Th
8700: 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69  is is common tai
8710: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
8720: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8730: 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65  tr() and.** btre
8740: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8750: 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73  ex() for the cas
8760: 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  e when the cell 
8770: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74  does not fit ent
8780: 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69  irely.** on a si
8790: 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65  ngle B-tree page
87a0: 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72  .  Make necessar
87b0: 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  y adjustments to
87c0: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a   the CellInfo.**
87d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
87e0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87f0: 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65  NLINE void btree
8800: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
8810: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a  izeForOverflow(.
8820: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8830: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8840: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8850: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8860: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8870: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8880: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8890: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
88a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
88b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
88c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f  ucture */.){.  /
88d0: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
88e0: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
88f0: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
8900: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
8910: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69  ave.  ** to deci
8920: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
8930: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
8940: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
8950: 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65  ll onto.  ** ove
8960: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
8970: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
8980: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
8990: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
89a0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
89b0: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
89c0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
89d0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
89e0: 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65  orage.  ** in be
89f0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
8a00: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a  nd maxLocal..  *
8a10: 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20  *.  ** Warning: 
8a20: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8a30: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8a40: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8a50: 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61  d in any.  ** wa
8a60: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
8a70: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
8a80: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
8a90: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
8aa0: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
8ab0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8ac0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ad0: 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b  .  int maxLocal;
8ae0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8af0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8b00: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8b10: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
8b20: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
8b30: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
8b40: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
8b50: 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  */..  minLocal =
8b60: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8b70: 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ;.  maxLocal = p
8b80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
8b90: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8ba0: 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e  ocal + (pInfo->n
8bb0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
8bc0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
8bd0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a  >usableSize-4);.
8be0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8bf0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8c00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
8c10: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
8c20: 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75   );.  if( surplu
8c30: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
8c40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
8c50: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
8c60: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8c80: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
8c90: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   }.  pInfo->nSiz
8ca0: 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  e = (u16)(&pInfo
8cb0: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8cc0: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8cd0: 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l) + 4;.}../*.**
8ce0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
8cf0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
8d00: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
8d10: 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73  he MemPage.xPars
8d20: 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f  eCell().** metho
8d30: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61  d..**.** Parse a
8d40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
8d50: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
8d60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
8d70: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74  ucture..**.** bt
8d80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8d90: 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61  )        =>   ta
8da0: 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e  ble btree leaf n
8db0: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8dc0: 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28  seCellNoPayload(
8dd0: 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74  )  =>   table bt
8de0: 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ree internal nod
8df0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8e00: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20  CellPtrIndex()  
8e10: 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65   =>   index btre
8e20: 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68  e nodes.**.** Th
8e30: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72  ere is also a wr
8e40: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62  apper function b
8e50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
8e60: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
8e70: 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79  * all MemPage ty
8e80: 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66  pes and that ref
8e90: 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c  erences the cell
8ea0: 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72   by index rather
8eb0: 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e   than.** by poin
8ec0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
8ed0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
8ee0: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a  llPtrNoPayload(.
8ef0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8f00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8f10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8f20: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8f30: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8f40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8f50: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8f60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8f70: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8f80: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8f90: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  ucture */.){.  a
8fa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8fb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8fc0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8fd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8fe0: 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  >leaf==0 );.  as
8ff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9000: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
9010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9020: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9030: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
9040: 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e  #endif.  pInfo->
9050: 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56  nSize = 4 + getV
9060: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
9070: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9080: 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  Key);.  pInfo->n
9090: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70  Payload = 0;.  p
90a0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
90b0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
90c0: 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  oad = 0;.  retur
90d0: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n;.}.static void
90e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
90f0: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
9100: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9110: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9120: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9130: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9140: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9150: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9160: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9170: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9180: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9190: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
91a0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
91b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
91c0: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
91d0: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
91e0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
91f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9200: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
9210: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36   payload */.  u6
9220: 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  4 iKey;         
9230: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
9240: 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  ed Key value */.
9250: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9260: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9270: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9290: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
92a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
92b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
92c0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
92d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
92f0: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
9300: 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cell;..  /* The 
9310: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9320: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9330: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9340: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9350: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
9360: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20  Payload);.  **. 
9370: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9380: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9390: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
93a0: 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  ..  */.  nPayloa
93b0: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
93c0: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
93d0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
93e0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
93f0: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
9400: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
9410: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
9420: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
9430: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9440: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49      }while( (*pI
9450: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
9460: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
9470: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a    pIter++;..  /*
9480: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9490: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
94a0: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
94b0: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
94c0: 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72   getVarint(pIter
94d0: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
94e0: 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  nKey);.  **.  **
94f0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
9500: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
9510: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
9520: 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49   */.  iKey = *pI
9530: 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e  ter;.  if( iKey>
9540: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
9550: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37  *pEnd = &pIter[7
9560: 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30  ];.    iKey &= 0
9570: 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31  x7f;.    while(1
9580: 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  ){.      iKey = 
9590: 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b  (iKey<<7) | (*++
95a0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
95b0: 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72       if( (*pIter
95c0: 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a  )<0x80 ) break;.
95d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e        if( pIter>
95e0: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
95f0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38   iKey = (iKey<<8
9600: 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20  ) | *++pIter;.  
9610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9630: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e   pIter++;..  pIn
9640: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34  fo->nKey = *(i64
9650: 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f  *)&iKey;.  pInfo
9660: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9670: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9680: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
9690: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
96a0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
96b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
96c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
96d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
96e0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
96f0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9710: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9720: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9730: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9740: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9750: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9760: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9770: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
9780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
9790: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
97a0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
97b0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
97c0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
97d0: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
97e0: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
97f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9800: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
9810: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9820: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9830: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9840: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9850: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9860: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9870: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
9880: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9890: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
98a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98b0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98e0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98f0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9900: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9910: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9920: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9930: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9940: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9950: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9960: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9970: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
9980: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9990: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
99a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
99b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
99c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
99d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
99e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
99f0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9a00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9a10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9a20: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9a30: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
9a40: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
9a50: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9a60: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
9a70: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
9a80: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9a90: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
9aa0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
9ab0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
9ac0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
9ad0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ae0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
9af0: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
9b00: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9b10: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9b20: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ;.  pInfo->nKey 
9b30: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b40: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9b50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9b60: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9b70: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9b80: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9b90: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9ba0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9bb0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9bc0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9bd0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9be0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9bf0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9c00: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9c10: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9c20: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9c30: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9c40: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9c50: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9c60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9c70: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9c80: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9c90: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9ca0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9cb0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9cc0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9cd0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ce0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9cf0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9d00: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9d10: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9d20: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9d30: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9d40: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9d50: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
9d60: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9d70: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9d80: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9d90: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9db0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
9dc0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
9dd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9de0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9df0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9e00: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
9e10: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
9e20: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
9e30: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
9e40: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
9e50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
9e60: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
9e70: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
9e80: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
9e90: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
9ea0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
9eb0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
9ec0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
9ed0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
9ee0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
9ef0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
9f00: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
9f10: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
9f20: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
9f30: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
9f40: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
9f50: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
9f60: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
9f70: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
9f80: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9f90: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
9fa0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
9fb0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
9fc0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
9fd0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
9fe0: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
9ff0: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
a000: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
a010: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
a020: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
a030: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
a040: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
a050: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
a060: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a070: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
a080: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
a090: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
a0a0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a0d0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
a0e0: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a110: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
a120: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
a130: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
a140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
a150: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a160: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
a170: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
a180: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
a190: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
a1a0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
a1b0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
a1c0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
a1d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
a1e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
a1f0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
a200: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
a210: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
a220: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
a230: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
a240: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
a250: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
a260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a280: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
a290: 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20  #endif..  nSize 
a2a0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
a2b0: 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20  nSize>=0x80 ){. 
a2c0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a2d0: 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26  [8];.    nSize &
a2e0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
a2f0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e        nSize = (n
a300: 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  Size<<7) | (*++p
a310: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
a320: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
a330: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
a340: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
a350: 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70  pIter++;.  if( p
a360: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
a370: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
a380: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
a390: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
a3a0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
a3b0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
a3c0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
a3d0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
a3e0: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
a3f0: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
a400: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
a410: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
a420: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
a430: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a440: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
a450: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
a460: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
a470: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
a480: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a490: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
a4a0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a4c0: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   );.  if( nSize<
a4d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a4e0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d   ){.    nSize +=
a4f0: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
a500: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Cell);.    if( n
a510: 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d  Size<4 ) nSize =
a520: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
a530: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
a540: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
a550: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
a560: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
a570: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
a580: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a590: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
a5a0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a5b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a5c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a5d0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a5e0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
a5f0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
a600: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a610: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a620: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
a630: 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31  nSize += 4 + (u1
a640: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
a650: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a660: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
a670: 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  o.nSize || CORRU
a680: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a690: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
a6a0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
a6b0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a6d0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
a6e0: 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20   *pIter = pCell 
a6f0: 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  + 4; /* For loop
a700: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a710: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a720: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a730: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a740: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a760: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a770: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a780: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a790: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a7a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a800: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a810: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a820: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a830: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a840: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a850: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a860: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a870: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a880: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a890: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a8a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65  ebuginfo);.#else
a8c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a8d0: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
a8e0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
a8f0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a900: 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d  e==4 );.  pEnd =
a910: 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68   pIter + 9;.  wh
a920: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
a930: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a940: 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nd );.  assert( 
a950: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d  debuginfo.nSize=
a960: 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70  =(u16)(pIter - p
a970: 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
a980: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a990: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a9a0: 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ell);.}...#ifdef
a9b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
a9c0: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
a9d0: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
a9e0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
a9f0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
aa00: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
aa10: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
aa20: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
aa30: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
aa40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
aa50: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
aa60: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
aa70: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
aa80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
aa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
aaa0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
aab0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
aac0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
aad0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
aae0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
aaf0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
ab00: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
ab10: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
ab20: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
ab30: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
ab40: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
ab50: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
ab60: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
ab70: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
ab80: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
ab90: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
aba0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
abb0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
abc0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
abd0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
abe0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
abf0: 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
ac00: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50  Payload ){.    P
ac10: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
ac20: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ac30: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
ac40: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
ac50: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
ac60: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
ac70: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
ac80: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
ac90: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
aca0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
acb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
acc0: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
acd0: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
ace0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
acf0: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
ad00: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
ad10: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
ad20: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
ad30: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
ad40: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
ad50: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
ad60: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
ad70: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
ad80: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
ad90: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
ada0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
adb0: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
adc0: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
add0: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ade0: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
adf0: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
ae00: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
ae10: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
ae20: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
ae30: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ae40: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
ae50: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ae60: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ae70: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ae80: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ae90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
aea0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
aeb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
aec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
aed0: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
aee0: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
af10: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
af40: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
af50: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
af80: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
af90: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
afa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
afb0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
afc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
afd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
afe0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
aff0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
b000: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
b010: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
b020: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b030: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b040: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
b050: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
b060: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
b070: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
b080: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
b090: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
b0a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b0b0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
b0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
b0d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b0f0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
b100: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
b110: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
b120: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
b130: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
b140: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
b150: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
b160: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
b170: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
b180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b190: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b1a0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
b1b0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
b1d0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
b1e0: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
b1f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b200: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b210: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b220: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b230: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
b240: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
b250: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
b260: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b270: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
b280: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
b290: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b2b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b2c0: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
b2d0: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
b2e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b2f0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
b300: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
b310: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
b320: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
b330: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
b340: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
b350: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
b360: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
b370: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
b380: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
b390: 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69  Cell;.  usableSi
b3a0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
b3b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
b3c0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  /* This block ha
b3d0: 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68  ndles pages with
b3e0: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72   two or fewer fr
b3f0: 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d  ee blocks and nM
b400: 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66  axFrag.  ** or f
b410: 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20  ewer fragmented 
b420: 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  bytes. In this c
b430: 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72  ase it is faster
b440: 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a   to move the.  *
b450: 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62  * two (or one) b
b460: 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75  locks of cells u
b470: 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61  sing memmove() a
b480: 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69  nd add the requi
b490: 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73  red.  ** offsets
b4a0: 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72   to each pointer
b4b0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
b4c0: 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20  nter array than 
b4d0: 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72  it is to .  ** r
b4e0: 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65  econstruct the e
b4f0: 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a  ntire page.  */.
b500: 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b    if( (int)data[
b510: 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67  hdr+7]<=nMaxFrag
b520: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65   ){.    int iFre
b530: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
b540: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
b550: 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20  if( iFree ){.   
b560: 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20     int iFree2 = 
b570: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
b580: 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  Free]);..      /
b590: 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29  * pageFindSlot()
b5a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72   has already ver
b5b0: 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20  ified that free 
b5c0: 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65  blocks are sorte
b5d0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72  d.      ** in or
b5e0: 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69  der of offset wi
b5f0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61  thin the page, a
b600: 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b  nd that no block
b610: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a   extends.      *
b620: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
b630: 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76  f the page. Prov
b640: 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65  ided the two fre
b650: 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a  e slots do not .
b660: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70        ** overlap
b670: 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  , this guarantee
b680: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f  s that the memmo
b690: 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77  ve() calls below
b6a0: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20   will not.      
b6b0: 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ** overwrite the
b6c0: 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65   usableSize byte
b6d0: 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66   buffer, even if
b6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
b6f0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  ge.      ** is c
b700: 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20  orrupt.  */.    
b710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
b720: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46  ==0 || iFree2>iF
b730: 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ree );.      ass
b740: 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62  ert( iFree+get2b
b750: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
b760: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
b770: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b780: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
b790: 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28  iFree2+get2byte(
b7a0: 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29  &data[iFree2+2])
b7b0: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b7c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
b7d0: 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b  iFree2 || (data[
b7e0: 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61  iFree2]==0 && da
b7f0: 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29  ta[iFree2+1]==0)
b800: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
b810: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
b820: 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
b830: 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  2];.        u8 *
b840: 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69  pAddr;.        i
b850: 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20  nt sz2 = 0;.    
b860: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
b870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b880: 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e+2]);.        i
b890: 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  nt top = get2byt
b8a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
b8c0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
b8d0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
b8e0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
b8f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b900: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  T;.          sz2
b910: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b920: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
b930: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b940: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
b950: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
b960: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
b970: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
b980: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
b990: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
b9a0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
b9b0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
b9c0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
b9d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b9e0: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
b9f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ba00: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
ba10: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
ba20: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
ba30: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
ba40: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
ba50: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
ba60: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
ba70: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
ba80: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
ba90: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
baa0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
bab0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
bac0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
bad0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
bae0: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
baf0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
bb00: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
bb10: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
bb20: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
bb30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
bb40: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
bb50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
bb60: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
bb70: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
bb80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
bb90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
bba0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
bbb0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
bbc0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
bbd0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
bbe0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
bbf0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
bc00: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
bc10: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
bc20: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc30: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
bc40: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc50: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
bc60: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
bc70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
bc80: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
bc90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
bca0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
bcb0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
bcc0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
bcd0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
bce0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
bcf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bd00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bd10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
bd20: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
bd30: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
bd40: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
bd50: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
bd60: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
bd70: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
bd80: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
bd90: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
bda0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
bdb0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bdc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bdd0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bde0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
bdf0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
be00: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
be10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
be20: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
be30: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
be40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
be50: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
be70: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
be80: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
be90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
bea0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
beb0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
bec0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
bed0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
bee0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
bef0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
bf00: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
bf10: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bf20: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
bf30: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
bf40: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
bf50: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
bf60: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
bf70: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
bf80: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
bf90: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
bfa0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
bfb0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
bfc0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
bfd0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
bfe0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c000: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c010: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
c020: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c030: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c040: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
c050: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
c060: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
c070: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
c080: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
c090: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
c0a0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
c0b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c0c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c0d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
c0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c0f0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
c100: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
c110: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
c120: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
c130: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
c140: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
c150: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
c160: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c170: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
c180: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
c190: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
c1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
c1b0: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
c1c0: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
c1d0: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
c1e0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
c1f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
c200: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
c210: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
c220: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
c230: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
c240: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
c250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c260: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c270: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
c280: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
c290: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
c2a0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
c2b0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
c2c0: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
c2d0: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
c2e0: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
c2f0: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
c300: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
c310: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
c320: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
c330: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
c340: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
c350: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
c360: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
c370: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
c380: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
c390: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
c3a0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
c3b0: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
c3c0: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
c3d0: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
c3e0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
c3f0: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
c400: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
c410: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
c420: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
c430: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
c440: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
c450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c460: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
c470: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
c480: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
c490: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
c4a0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
c4b0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
c4c0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
c4d0: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
c4e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
c4f0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
c500: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
c510: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
c520: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c530: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c540: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
c550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
c560: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
c570: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
c580: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
c590: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
c5a0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
c5b0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c5c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
c5d0: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
c5e0: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
c5f0: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
c600: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
c610: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
c620: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c630: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
c640: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
c650: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
c660: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
c670: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
c680: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
c690: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
c6a0: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
c6b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
c6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
c6d0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
c6e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
c6f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c700: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
c710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
c720: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
c730: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
c740: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
c750: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
c760: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
c770: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
c780: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
c790: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
c7a0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
c7b0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
c7c0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
c7d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
c7e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c7f0: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
c800: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
c810: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
c820: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
c830: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
c840: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
c850: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
c860: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
c870: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
c880: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
c890: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
c8a0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
c8b0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
c8c0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
c8d0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
c8e0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
c8f0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
c900: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
c910: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
c920: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
c930: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
c940: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
c950: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
c960: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
c970: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
c980: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
c990: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
c9a0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
c9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
c9c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
c9d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
c9e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
c9f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
ca00: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
ca10: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
ca20: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
ca30: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
ca40: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
ca50: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
ca60: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
ca70: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
ca80: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
ca90: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
caa0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
cab0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
cac0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
cad0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
cae0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
caf0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
cb00: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
cb10: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
cb20: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
cb30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
cb40: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
cb50: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
cb60: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
cb70: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
cb80: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
cb90: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
cba0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
cbb0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
cbc0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
cbd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
cbe0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
cbf0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
cc00: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
cc10: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
cc20: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
cc30: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
cc40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
cc50: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
cc60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
cc70: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
cc80: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc90: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
cca0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
ccb0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ccc0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
ccd0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
cce0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ccf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
cd00: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
cd10: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
cd20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd40: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
cd50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cd60: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
cd70: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cd90: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
cda0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cdc0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
cdd0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
cde0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
cdf0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
ce00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ce10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ce20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ce30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ce40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
ce50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ce60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ce70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
ce80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
ce90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
cea0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
ceb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cec0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
ced0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cee0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
cef0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
cf00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
cf10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
cf20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
cf30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
cf40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
cf50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
cf60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
cf70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
cf80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
cf90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
cfa0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
cfb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
cfc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
cfd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
cfe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
cff0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d000: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d010: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d020: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d030: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d040: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d050: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d060: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d070: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d080: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d090: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d0a0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d0b0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d0c0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
d0d0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
d0e0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
d0f0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
d100: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
d110: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d120: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
d130: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d140: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
d150: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
d160: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
d170: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
d180: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
d190: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
d1a0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
d1b0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
d1c0: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
d1d0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d1f0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
d200: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
d210: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
d220: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
d230: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
d240: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
d250: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
d260: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
d270: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
d280: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
d290: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
d2a0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
d2b0: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
d2c0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
d2d0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
d2e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
d2f0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
d300: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
d310: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d320: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
d330: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
d340: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
d350: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
d360: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
d370: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
d380: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
d390: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
d3a0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
d3b0: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
d3c0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
d3d0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
d3e0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
d3f0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
d400: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
d410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d420: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
d430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d450: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
d460: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
d470: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
d480: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
d490: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
d4a0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
d4b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
d4c0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
d4d0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
d4e0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
d4f0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
d500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d510: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
d520: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
d530: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
d540: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
d550: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
d560: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
d570: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d580: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
d590: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
d5a0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
d5b0: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
d5c0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
d5d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
d5e0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
d5f0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
d600: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d610: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
d620: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d630: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
d640: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
d650: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
d660: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
d670: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
d680: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
d690: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
d6a0: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
d6b0: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
d6c0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
d6d0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
d6e0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
d6f0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
d700: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
d710: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
d720: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
d730: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
d740: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
d750: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
d760: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
d770: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
d780: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
d790: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
d7a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d7b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d7c0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
d7d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
d7e0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
d7f0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
d800: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
d810: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
d820: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
d830: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
d840: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
d850: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d860: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
d870: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
d880: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
d890: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
d8a0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
d8b0: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
d8c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d8d0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
d8e0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
d8f0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
d900: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
d910: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
d920: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
d930: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
d940: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d950: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d960: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d970: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d980: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d990: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d9a0: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d9b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d9c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d9d0: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d9e0: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d9f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
da00: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
da10: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
da20: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
da30: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
da60: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
da70: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
da80: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
da90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
daa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
dab0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
dac0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
dad0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
db00: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
db10: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
db20: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
db50: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
db60: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
db70: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
db80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
db90: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
dba0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
dbb0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
dbc0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
dbd0: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
dbe0: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
dbf0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
dc00: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
dc10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
dc20: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
dc30: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
dc40: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
dc50: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
dc60: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
dc70: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
dc80: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
dc90: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
dca0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dcb0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
dcc0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
dcd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
dce0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
dcf0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
dd00: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
dd10: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
dd20: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
dd30: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
dd40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
dd50: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
dd60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dd70: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
dd80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
dd90: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
dda0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
ddb0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
ddc0: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
ddd0: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
dde0: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
ddf0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
de00: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
de10: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
de20: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
de30: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
de40: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
de50: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
de60: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
de70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
de80: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
de90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
dea0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
deb0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
dec0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
ded0: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
dee0: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
def0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
df00: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
df10: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
df20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
df30: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
df40: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
df50: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
df60: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
df70: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
df80: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
df90: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
dfa0: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
dfb0: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
dfc0: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
dfd0: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
dfe0: 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61  ata[iPtr]))<iSta
dff0: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
e000: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
e010: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
e020: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65  FreeBlk==0 ) bre
e030: 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ak;.        retu
e040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
e060: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e070: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e080: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
e090: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
e0a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e0b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
e0c0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
e0d0: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
e0e0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
e0f0: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
e100: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
e110: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
e120: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
e130: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
e140: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
e150: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
e160: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
e170: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
e180: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
e190: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
e1a0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
e1b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e1c0: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
e1d0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e1e0: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
e1f0: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
e200: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
e210: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
e220: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e250: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
e260: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
e270: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
e280: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
e290: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
e2a0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
e2b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e2c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
e2d0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
e2e0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
e2f0: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e300: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
e310: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e320: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
e330: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
e340: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
e350: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
e360: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
e370: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
e380: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
e390: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
e3a0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
e3b0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
e3c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
e3d0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
e3e0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
e3f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
e400: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
e410: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
e420: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e430: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
e440: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e450: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
e460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e470: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e480: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
e490: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
e4a0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
e4b0: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
e4c0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
e4d0: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
e4e0: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
e4f0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
e500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e510: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
e520: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
e530: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
e540: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
e550: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
e560: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
e570: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
e580: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e590: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e5a0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
e5b0: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
e5c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e5d0: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
e5e0: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
e5f0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
e600: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
e610: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
e620: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e630: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
e640: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e650: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
e660: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e670: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
e680: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e690: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
e6a0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
e6b0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
e6c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e6d0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
e6e0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e6f0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
e700: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e710: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e720: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
e730: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
e740: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
e750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e760: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
e770: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
e780: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
e790: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
e7a0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
e7b0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
e7c0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
e7d0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
e7e0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
e7f0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
e800: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
e810: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
e820: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
e830: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
e840: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
e850: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
e860: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e870: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
e880: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
e890: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
e8a0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e8b0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e8c0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e8d0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e8e0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e900: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e910: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e920: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
e930: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
e940: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
e950: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
e960: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
e970: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
e980: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
e990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e9a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e9b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e9c0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
e9d0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
e9e0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
e9f0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
ea00: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
ea10: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
ea20: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
ea30: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
ea40: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
ea50: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
ea60: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
ea70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
ea80: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
ea90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eaa0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
eab0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eac0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
ead0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
eae0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
eaf0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
eb00: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
eb10: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
eb20: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
eb30: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
eb40: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
eb50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
eb60: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
eb70: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
eb80: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
eb90: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
eba0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
ebb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ebc0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
ebd0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
ebe0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
ebf0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
ec00: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ec10: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
ec20: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
ec30: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
ec40: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
ec50: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
ec60: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
ec70: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
ec80: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
ec90: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
eca0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ecb0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
ecc0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ecd0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
ece0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
ecf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ed00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
ed10: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ed20: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ed30: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
ed40: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
ed50: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
ed60: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
ed70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
ed80: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
ed90: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
eda0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
edb0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
edc0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
edd0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ede0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
edf0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
ee00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
ee10: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
ee20: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
ee30: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ee40: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
ee50: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ee60: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ee70: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
ee80: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
ee90: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
eea0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
eeb0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
eec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
eed0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
eee0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
eef0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
ef00: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
ef10: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
ef20: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ef30: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ef40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ef50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ef60: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ef70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ef80: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ef90: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
efa0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
efb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
efc0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
efd0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
efe0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
eff0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
f000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f010: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
f020: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
f030: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
f040: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
f050: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
f060: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
f070: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
f080: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
f090: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
f0a0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
f0b0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
f0c0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
f0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
f0e0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
f0f0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
f100: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
f110: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
f120: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
f130: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
f140: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
f150: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
f160: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
f170: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
f180: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
f190: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
f1a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
f1b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f1c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
f1d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
f1e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f1f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f200: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f210: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
f220: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
f230: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
f240: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
f250: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
f260: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
f270: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f290: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
f2a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
f2b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
f2c0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
f2d0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
f2e0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
f2f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
f300: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
f310: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
f320: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
f330: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
f340: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
f350: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
f360: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
f370: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
f380: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
f390: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
f3a0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f3b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f3c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f3d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
f3e0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
f3f0: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
f400: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
f410: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
f420: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
f430: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
f440: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
f450: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
f460: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
f470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f480: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
f490: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
f4a0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
f4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
f4c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
f4d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f4e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
f4f0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
f500: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
f510: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
f520: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
f530: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
f540: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
f550: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
f560: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
f570: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
f580: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
f590: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
f5a0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
f5b0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
f5c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5d0: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
f5e0: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
f5f0: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
f600: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
f610: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
f620: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
f630: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
f640: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
f650: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f660: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
f670: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
f680: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
f690: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
f6a0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
f6b0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
f6c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
f6d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
f6e0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
f6f0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
f700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f710: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
f720: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
f730: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
f740: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f750: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
f760: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
f770: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
f780: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
f790: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
f7a0: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
f7b0: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
f7c0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
f7d0: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
f7e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
f7f0: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
f800: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f810: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
f820: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
f830: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
f840: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
f850: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
f860: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
f870: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
f880: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
f890: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
f8a0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
f8b0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
f8c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f8d0: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
f8e0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f8f0: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
f900: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
f910: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
f920: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
f930: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
f940: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f950: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
f960: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
f970: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
f980: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f990: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f9a0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f9b0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f9c0: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f9d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f9e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f9f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
fa00: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
fa10: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
fa20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa30: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
fa40: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
fa50: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
fa60: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
fa70: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
fa80: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
fa90: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
faa0: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
fab0: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
fac0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
fad0: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
fae0: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
faf0: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
fb00: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
fb10: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
fb20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fb30: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
fb40: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
fb50: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
fb60: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
fb70: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
fb80: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
fb90: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
fba0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
fbb0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
fbc0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
fbd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
fbe0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
fbf0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
fc00: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
fc10: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
fc20: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
fc30: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
fc40: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
fc50: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
fc60: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
fc70: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
fc80: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
fc90: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
fca0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
fcb0: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
fcc0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
fcd0: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
fce0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
fcf0: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
fd00: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fd20: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
fd30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
fd40: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
fd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd60: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
fd70: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
fd80: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
fd90: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
fda0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
fdb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
fdc0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
fdd0: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
fde0: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
fdf0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
fe00: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
fe10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
fe20: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
fe30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
fe40: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
fe50: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
fe60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fe70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fe80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
fe90: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
fea0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
feb0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
fec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
fed0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
fee0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
fef0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
ff00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ff10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ff20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ff30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
ff50: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ff60: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
ff70: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ff80: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ff90: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ffa0: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
ffb0: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
ffc0: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
ffd0: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
ffe0: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
fff0: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
10000 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10010 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
10020 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
10030 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
10040 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
10050 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
10060 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
10070 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
10080 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
10090 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
100a0 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
100b0 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
100c0 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20     if( pc>0 ){. 
100d0 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73       u32 next, s
100e0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
100f0 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
10100 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
10110 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
10120 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
10130 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
10140 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
10150 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
10160 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
10170 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10180 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10190 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
101a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
101b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
101c0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
101d0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
101e0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
101f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a  CORRUPT_BKPT; /*
10220 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
10230 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
10240 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ge */.        }.
10250 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67          next = g
10260 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10270 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  ]);.        size
10280 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10290 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
102a0 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
102b0 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  + size;.        
102c0 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
102d0 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
102e0 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10300 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
10310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10320 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
10330 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10340 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10350 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rder */.      }.
10360 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a        if( pc+siz
10370 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10380 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
103a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
103b0 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62  ;  /* Last freeb
103c0 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
103d0 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
103e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
103f0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
10400 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
10410 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
10420 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
10430 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
10440 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
10450 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
10460 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
10470 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
10480 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10490 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
104a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
104b0 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
104c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
104d0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
104e0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
104f0 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
10500 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
10510 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
10520 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
10530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10540 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
10550 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
10560 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
10570 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
10580 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
10590 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
105a0 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
105b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
105c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
105d0 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
105e0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
105f0 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
10600 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
10610 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
10620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10630 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10640 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10650 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10660 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10670 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10680 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10690 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
106a0 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
106b0 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
106c0 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
106d0 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
106e0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
106f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10700 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10710 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10720 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10740 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10750 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10760 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10780 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
10790 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
107a0 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
107b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
107c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
107d0 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
107e0 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
107f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10800 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
10810 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10830 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10840 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10850 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
10860 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
10870 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
10880 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
10890 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
108a0 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
108b0 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
108c0 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
108d0 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
108e0 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
108f0 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
10900 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
10910 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
10920 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
10930 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
10940 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
10950 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
10960 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
10970 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10980 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
10990 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
109a0 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
109b0 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
109c0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
109d0 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
109e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
109f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
10a00 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
10a10 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
10a20 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
10a30 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
10a40 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
10a50 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
10a60 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
10a70 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
10a80 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
10a90 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
10aa0 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
10ab0 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
10ac0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
10ad0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
10ae0 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
10af0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
10b00 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
10b10 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
10b20 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
10b30 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
10b40 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
10b50 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
10b60 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
10b70 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
10b80 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
10b90 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
10ba0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
10bb0 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
10bc0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
10bd0 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
10be0 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
10bf0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
10c00 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
10c10 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10c20 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
10c30 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
10c40 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
10c50 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
10c60 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
10c70 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
10c80 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
10c90 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
10ca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
10cb0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
10cc0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10cd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
10ce0 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
10cf0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10d00 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
10d10 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10d20 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10d30 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10d40 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
10d50 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
10d60 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
10d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
10d80 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10d90 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
10da0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
10db0 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
10dc0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
10dd0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
10de0 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
10df0 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
10e00 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
10e10 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
10e20 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
10e30 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
10e40 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
10e50 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
10e60 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
10e70 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
10e80 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
10e90 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
10ea0 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
10eb0 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
10ec0 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
10ed0 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
10ee0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
10ef0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
10f00 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
10f10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10f20 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
10f30 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
10f40 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
10f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10f60 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
10f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
10f80 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
10f90 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
10fa0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
10fb0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
10fc0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
10fd0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
10fe0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
10ff0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
11000 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
11010 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
11020 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
11030 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
11040 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
11050 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
11060 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
11070 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11080 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11090 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
110a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
110b0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
110c0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
110d0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
110e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
110f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
11100 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11110 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11120 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
11130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11140 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
11150 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
11160 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
11170 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
11180 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
11190 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
111a0 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
111b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
111c0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
111d0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
111e0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
111f0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
11200 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
11210 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
11220 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
11230 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
11240 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11260 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11270 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
11280 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
11290 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
112a0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
112b0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
112c0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
112d0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
112e0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
112f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11300 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
11310 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11320 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
11330 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
11340 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
11350 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
11360 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
11370 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
11380 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
11390 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
113a0 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
113b0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
113c0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
113d0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
113e0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
113f0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
11400 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
11410 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
11420 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
11430 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
11440 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
11450 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
11460 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
11470 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
11480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
11490 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
114a0 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
114b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
114c0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
114d0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
114e0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
114f0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
11500 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
11510 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
11520 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
11530 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
11540 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
11550 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
11560 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
11570 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
11580 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
11590 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
115a0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
115b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
115c0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
115d0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
115e0 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
115f0 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
11600 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
11610 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
11620 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
11630 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
11640 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
11650 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
11660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
11670 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
11680 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
116b0 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
116c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
116d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
116e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
116f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
11700 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
11710 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
11720 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
11730 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
11740 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
11750 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
11760 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
11770 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
11780 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
11790 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
117a0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
117b0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
117c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
117d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
117e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
117f0 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
11800 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
11810 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
11820 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11830 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
11840 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
11850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11860 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
11870 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
11880 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
11890 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
118a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
118b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
118c0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
118d0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
118e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
118f0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
11900 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
11910 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
11920 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
11930 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
11940 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11950 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
11960 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
11970 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11980 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
11990 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
119a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
119b0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119c0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119d0 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
119e0 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
119f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11a20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11a30 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11a40 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
11a50 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
11a60 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
11a70 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
11a80 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
11a90 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
11aa0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
11ab0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
11ac0 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
11ad0 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
11ae0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
11af0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
11b00 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
11b10 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
11b20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
11b30 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
11b40 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
11b50 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
11b60 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
11b70 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
11b80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11b90 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  PT;.    releaseP
11ba0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11bb0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11bc0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11be0 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
11bf0 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
11c00 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
11c10 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
11c20 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
11c30 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
11c40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
11c50 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
11c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11c70 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
11c80 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
11c90 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
11ca0 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
11cb0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
11cc0 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
11cd0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11ce0 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
11cf0 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
11d00 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11d20 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
11d30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
11d40 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
11d50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11d60 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11d70 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11d80 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11d90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11da0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11db0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11dc0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
11dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11de0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11df0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
11e10 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
11e20 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
11e30 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11e40 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11e50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
11e60 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
11e70 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
11e80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
11e90 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
11ea0 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
11eb0 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
11ec0 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
11ed0 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
11ee0 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
11ef0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
11f00 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
11f10 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
11f20 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
11f30 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
11f40 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
11f50 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
11f60 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
11f70 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
11f80 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
11f90 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
11fa0 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
11fb0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11fc0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
11fd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
11fe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11ff0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12000 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
12010 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12020 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
12030 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12040 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
12050 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12060 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12070 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12080 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12090 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
120a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
120b0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
120c0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
120f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
12100 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
12110 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
12120 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12130 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
12140 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
12150 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12160 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12170 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12180 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12190 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
121a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
121b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
121c0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
121d0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
121e0 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
121f0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
12200 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
12210 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
12220 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
12230 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
12240 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
12250 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12260 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12270 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12280 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
122a0 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
122b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
122c0 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
122d0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
122e0 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
122f0 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
12300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12310 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
12320 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
12330 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
12340 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
12350 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12360 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12380 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12390 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
123a0 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
123b0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
123c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
123d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
123e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
123f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
12400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12410 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12420 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
12430 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
12440 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
12450 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12460 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12470 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12480 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12490 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
124a0 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
124b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
124c0 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
124d0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
124e0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
124f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
12500 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
12510 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
12520 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
12530 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
12540 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
12550 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12560 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12570 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12580 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12590 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
125a0 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
125b0 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
125c0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
125d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
125e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
125f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
12600 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
12610 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
12620 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
12630 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12640 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
12650 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12660 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12670 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12680 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12690 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126a0 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
126b0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
126c0 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
126d0 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
126e0 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
12700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
12710 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
12720 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
12730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12740 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
12750 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
12760 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
12770 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
12780 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
12790 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
127a0 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
127b0 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
127c0 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
127d0 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
127e0 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
127f0 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
12800 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
12810 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
12820 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
12830 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
12840 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
12850 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
12860 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12870 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
12880 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12890 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
128a0 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
128b0 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
128c0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
128d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
128e0 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
128f0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
12900 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
12910 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
12920 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
12930 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
12940 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
12950 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
12960 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
12970 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12980 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12990 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
129a0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
129b0 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
129c0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
129d0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
129e0 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
129f0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
12a00 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
12a10 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
12a20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12a30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
12a40 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
12a50 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
12a60 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
12a70 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12a80 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
12a90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12aa0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12ab0 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
12ac0 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
12ad0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12ae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12af0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
12b00 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
12b10 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
12b20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12b30 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
12b40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12b50 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
12b60 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
12b70 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
12b80 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
12b90 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
12ba0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12bb0 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
12bc0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12be0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12bf0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12c00 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12c10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12c20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12c30 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
12c40 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
12c50 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
12c60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12c70 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
12c80 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
12c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
12ca0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
12cb0 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
12cc0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
12cd0 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
12ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12cf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
12d00 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
12d10 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
12d20 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
12d30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12d40 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
12d50 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
12d60 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
12d70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
12d80 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
12d90 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
12da0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
12db0 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
12dc0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
12dd0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12de0 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
12df0 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
12e00 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
12e10 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
12e20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
12e30 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
12e40 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
12e50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
12e60 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
12e70 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
12e80 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
12e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12ea0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
12eb0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12ec0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
12ed0 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12ee0 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
12ef0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
12f00 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
12f30 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
12f40 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
12f70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12f80 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
12f90 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12fa0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
12fb0 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
12fc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12fd0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12fe0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12ff0 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
13000 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
13010 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
13020 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
13030 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
13040 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
13050 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
13060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13070 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
13080 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
13090 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
130a0 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
130b0 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
130c0 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
130d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
130e0 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
130f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
13100 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
13110 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
13120 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
13130 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
13140 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
13150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
13160 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13170 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
13180 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
13190 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
131a0 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
131b0 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
131c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
131d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
131e0 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
131f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13200 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
13210 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
13220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13230 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13240 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13250 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13260 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13270 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13280 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13290 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
132a0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
132b0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
132c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
132d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
132e0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
132f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13300 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
13310 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
13320 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
13330 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
13340 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
13350 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13360 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13370 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13380 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13390 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
133a0 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
133b0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
133c0 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
133d0 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
133e0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
133f0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
13400 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
13410 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13420 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
13430 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
13440 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13450 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13460 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13470 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13480 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13490 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
134a0 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
134b0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
134c0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
134d0 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
134e0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
134f0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
13500 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
13510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13520 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13540 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
13550 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13560 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13570 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
13580 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
13590 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
135a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
135b0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
135c0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
135d0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
13600 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
13610 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13640 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13650 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13660 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13670 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13690 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
136a0 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
136b0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
136c0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
136d0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
136e0 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
136f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13700 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
13710 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
13720 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13730 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13740 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13760 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13770 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
13780 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
13790 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
137a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
137b0 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
137c0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
137d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
137e0 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
137f0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
13800 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
13810 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
13820 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
13830 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
13840 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
13850 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
13860 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
13870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13880 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
13890 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
138a0 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
138b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
138c0 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
138d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
138e0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
138f0 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
13900 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
13910 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
13920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13930 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
13940 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13960 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13970 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
13980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13990 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
139b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
139d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
139e0 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
139f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13a00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13a10 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13a20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13a50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13a60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13a70 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13a80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13a90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13aa0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
13ab0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
13ac0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
13ad0 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
13ae0 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
13af0 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
13b00 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13b10 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13b20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13b30 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13b40 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13b50 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13b60 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13b70 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13b90 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13ba0 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
13bb0 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
13bc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
13bd0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13be0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
13bf0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
13c00 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13c10 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13c20 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13c30 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13c40 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13c50 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13c60 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13c70 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13c80 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13c90 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13ca0 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
13cb0 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
13cc0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
13cd0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
13ce0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13cf0 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
13d00 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13d10 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13d20 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13d30 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13d40 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13d50 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13d60 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13d70 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13d80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13d90 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13da0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
13db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
13dc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
13dd0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13de0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13df0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13e00 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
13e10 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
13e20 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13e50 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
13e60 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13e70 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13ea0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13ec0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13ee0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
13f00 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
13f10 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
13f20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13f40 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13f50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
13f60 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
13f70 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
13f80 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
13f90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
13fa0 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
13fb0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
13fc0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
13fd0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
13fe0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
13ff0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
14000 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
14010 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14020 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
14030 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
14040 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
14050 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
14060 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
14070 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
14080 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14090 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
140a0 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
140b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
140c0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
140d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
140e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
140f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
14100 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
14110 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
14120 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
14130 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
14140 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
14150 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
14160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14170 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
14180 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
14190 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
141a0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
141b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
141c0 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
141d0 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
141e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
141f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
14200 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
14210 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
14220 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
14230 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
14240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14250 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
14260 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
14270 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
14280 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
14290 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
142a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
142b0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
142c0 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
142d0 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
142e0 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
142f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14300 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
14310 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
14320 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
14330 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
14340 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
14350 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
14360 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
14370 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
14380 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
14390 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
143a0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
143b0 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
143c0 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
143d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
143e0 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
143f0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14400 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
14410 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14420 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
14430 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
14440 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
14450 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
14460 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
14470 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
14480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
14490 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
144a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
144b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
144c0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
144d0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
144e0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
144f0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
14500 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
14510 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
14520 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
14530 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
14540 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
14550 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
14560 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
14570 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
14580 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
14590 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
145a0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
145b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
145c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
145d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
145e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
145f0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
14600 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
14610 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
14620 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14630 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14640 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
14650 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
14660 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14670 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14680 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14690 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
146a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
146b0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
146c0 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
146d0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
146e0 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
146f0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
14700 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
14710 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
14720 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
14730 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
14740 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
14750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14760 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14780 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
14790 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
147a0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
147b0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
147c0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
147d0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
147e0 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
147f0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
14800 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
14810 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14820 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
14830 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
14840 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14850 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14860 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14870 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14880 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14890 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
148a0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
148b0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
148c0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
148d0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
148e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
148f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14910 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14950 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14970 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14980 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14990 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
149a0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
149b0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149c0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
149d0 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
149e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14a00 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
14a10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a20 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14a30 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
14a40 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
14a50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14a60 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14a70 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14a80 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14a90 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
14aa0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
14ab0 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
14ac0 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
14ad0 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
14ae0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
14af0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
14b00 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
14b10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
14b20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
14b30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
14b40 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
14b50 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
14b60 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14b70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
14b80 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
14b90 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14bb0 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
14bc0 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
14bd0 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
14be0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
14bf0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
14c00 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
14c10 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
14c20 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
14c30 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
14c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14c50 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14c60 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14c70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14c80 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14c90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14ca0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14cb0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
14cc0 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
14cd0 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
14ce0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14cf0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
14d00 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14d10 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
14d20 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
14d30 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
14d40 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
14d50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
14d60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
14d70 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
14d80 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14da0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
14db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
14de0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
14df0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
14e00 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
14e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14e20 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
14e30 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
14e40 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14e50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e70 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14e80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14e90 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14ea0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14eb0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
14ec0 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
14ed0 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
14ee0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
14ef0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
14f00 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
14f10 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
14f20 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
14f30 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
14f40 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
14f50 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
14f60 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
14f70 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
14f80 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
14f90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
14fa0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
14fb0 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
14fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14fd0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
14fe0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
14ff0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
15000 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
15010 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
15020 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
15030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15040 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
15050 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
15060 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15070 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
15080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
15090 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
150a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
150b0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
150c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
150d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
150e0 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
150f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15100 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
15110 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
15120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
15130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
15140 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
15150 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
15160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15170 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
15180 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15190 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
151a0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
151b0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
151c0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
151d0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
151e0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
151f0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
15200 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
15210 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
15220 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
15230 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
15240 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
15250 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
15260 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15270 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15290 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
152a0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
152b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
152c0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
152d0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
152e0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
152f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15300 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
15310 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15320 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
15330 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
15340 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15350 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15360 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
15370 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15380 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
15390 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
153a0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
153b0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
153c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
153d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
153e0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
153f0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15400 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15410 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
15420 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
15430 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
15440 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15450 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15460 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
15470 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
15480 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
15490 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
154a0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
154b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
154c0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
154d0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
154e0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
154f0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
15500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15510 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
15520 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
15530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
15540 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
15550 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
15560 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
15570 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
15580 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
15590 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
155a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
155b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
155c0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
155d0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
155e0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
155f0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
15600 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
15610 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
15620 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
15630 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
15640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
15650 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
15660 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15670 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
15680 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
15690 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
156a0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
156b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
156c0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
156d0 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
156e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
156f0 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
15700 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
15710 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
15720 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
15730 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
15740 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
15750 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
15760 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
15770 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
15780 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
15790 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
157a0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
157b0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
157c0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
157d0 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
157e0 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
157f0 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
15800 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
15810 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
15820 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
15830 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
15840 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
15850 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
15860 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
15870 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
15880 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
15890 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
158a0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
158b0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
158c0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
158d0 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
158e0 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
158f0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
15900 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
15910 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
15920 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
15930 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
15940 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15950 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
15960 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
15970 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
15980 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
15990 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
159a0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
159b0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
159c0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
159d0 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
159e0 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
159f0 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
15a00 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
15a10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
15a20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
15a30 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
15a40 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
15a50 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
15a60 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
15a70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15a80 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
15a90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
15aa0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
15ab0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
15ac0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
15ad0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15ae0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
15af0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15b00 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15b10 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
15b20 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
15b30 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
15b40 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15b50 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
15b60 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
15b70 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
15b80 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
15b90 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
15ba0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
15bb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
15bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15bd0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
15be0 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
15bf0 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
15c00 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
15c10 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
15c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15c30 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15c40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15c50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c60 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
15c70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
15c80 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
15c90 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
15ca0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
15cb0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15cc0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
15cd0 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
15ce0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15cf0 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
15d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
15d10 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
15d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15d30 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
15d40 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
15d50 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
15d60 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15d70 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
15d80 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
15d90 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
15da0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
15db0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
15dc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
15dd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15de0 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
15df0 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
15e00 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
15e10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
15e20 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
15e30 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
15e40 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
15e50 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
15e60 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
15e70 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
15e80 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
15e90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15ea0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
15eb0 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
15ec0 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
15ed0 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
15ee0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15ef0 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
15f00 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
15f10 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
15f20 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
15f30 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
15f40 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
15f50 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
15f60 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
15f70 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
15f80 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
15f90 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
15fa0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15fb0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
15fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15fd0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
15fe0 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
15ff0 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
16000 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
16010 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
16020 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
16030 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
16040 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16050 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
16060 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
16070 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16090 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
160a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
160b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
160c0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
160d0 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
160e0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
160f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
16100 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
16110 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16120 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
16130 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
16140 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
16150 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
16160 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
16170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16180 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16190 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
161a0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
161b0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
161c0 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
161d0 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
161e0 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
161f0 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
16200 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
16210 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
16220 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
16230 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
16240 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
16250 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
16260 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
16270 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
16280 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
16290 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
162a0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
162b0 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
162c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
162d0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
162e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
162f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16320 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16330 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16340 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16350 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16360 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16370 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16380 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16390 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
163a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
163b0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
163c0 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
163d0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
163e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
163f0 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
16400 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16410 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
16420 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
16430 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
16440 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
16450 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
16460 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
16470 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
16480 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
16490 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
164a0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
164b0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
164c0 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
164d0 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
164e0 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
164f0 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
16500 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
16510 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
16520 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
16530 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
16540 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
16550 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
16560 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
16570 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16580 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
16590 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
165a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
165b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
165c0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
165d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
165e0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
165f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16600 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
16610 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
16620 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
16630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16660 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
16670 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16680 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
16690 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
166a0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
166b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
166c0 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
166d0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
166e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
166f0 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
16700 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
16710 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
16720 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16730 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16750 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16760 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16770 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16780 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16790 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
167a0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
167b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
167c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
167d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
167e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
167f0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
16800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
16810 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
16820 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
16830 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
16840 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
16850 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
16860 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
16870 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
16880 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
16890 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
168a0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
168b0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
168c0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
168d0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
168e0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
168f0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16900 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
16910 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
16920 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
16930 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
16940 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
16950 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
16960 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
16970 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
16980 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
16990 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
169a0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
169b0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
169c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
169d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
169e0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
169f0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
16a00 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a20 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
16a30 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
16a40 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
16a50 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
16a60 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
16a70 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
16a80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16a90 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16aa0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16ab0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16ac0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ad0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16af0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
16b00 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
16b10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16b20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16b30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16b40 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
16b50 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
16b60 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
16b70 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16b80 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
16b90 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
16ba0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
16bb0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
16bc0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
16bd0 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
16be0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
16bf0 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
16c00 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
16c10 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
16c20 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16c30 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
16c40 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
16c50 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
16c60 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
16c70 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
16c80 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
16c90 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16ca0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
16cb0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
16cc0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
16cd0 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
16ce0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
16cf0 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
16d00 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
16d10 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
16d20 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
16d30 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
16d40 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
16d50 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
16d60 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
16d70 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
16d80 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
16d90 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
16da0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
16db0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
16dc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16dd0 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
16de0 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
16df0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
16e00 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
16e10 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
16e20 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
16e30 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
16e40 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
16e50 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
16e60 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
16e70 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
16e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16e90 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
16ea0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
16eb0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16ec0 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
16ed0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16ee0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
16ef0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f00 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16f10 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
16f20 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
16f30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16f40 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
16f50 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
16f60 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
16f70 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
16f80 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
16f90 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
16fa0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
16fb0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fc0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
16fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
16fe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
16ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17000 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
17010 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
17020 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
17030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17040 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
17050 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
17060 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
17070 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17080 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
17090 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
170a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
170b0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
170c0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
170d0 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
170e0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
170f0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
17100 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
17110 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
17120 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
17130 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
17140 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
17150 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
17160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
17170 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
17180 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
17190 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
171a0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
171b0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
171c0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
171d0 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
171e0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
171f0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
17200 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
17210 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17240 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
17250 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
17260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17270 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
17280 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
17290 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
172a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
172b0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
172c0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
172d0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
172e0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
172f0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
17300 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
17310 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
17320 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
17330 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
17340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
17350 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
17360 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
17370 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
17380 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
17390 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
173a0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
173b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
173c0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
173d0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
173e0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
173f0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
17400 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
17410 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
17420 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
17430 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
17440 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
17450 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
17460 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
17470 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
17480 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
17490 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
174a0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
174b0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
174c0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
174d0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
174e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
174f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
17500 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
17510 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
17520 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
17530 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
17540 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
17550 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17560 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
17570 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
17580 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
17590 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
175a0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
175b0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
175c0 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
175d0 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
175e0 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
175f0 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
17600 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
17610 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
17620 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
17630 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
17640 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
17650 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
17660 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
17670 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
17680 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
17690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
176a0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
176b0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
176c0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
176d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176e0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
176f0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17700 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
17710 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17720 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
17730 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17740 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
17750 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
17760 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
17770 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17780 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
17790 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
177a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
177b0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
177c0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
177d0 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
177e0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
177f0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
17800 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
17810 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
17820 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
17830 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
17840 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
17850 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17860 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
17870 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
17880 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
17890 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
178a0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
178b0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
178c0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
178d0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
178e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
178f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
17910 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17920 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
17930 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
17940 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
17950 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
17960 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
17970 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
17980 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
17990 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
179a0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
179b0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
179c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
179d0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
179e0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
179f0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
17a00 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17a10 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
17a20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17a30 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
17a40 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
17a50 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
17a60 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
17a70 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
17a80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17a90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17aa0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
17ab0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17ac0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
17ad0 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
17ae0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17af0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
17b00 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17b10 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17b20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
17b30 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
17b40 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
17b50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
17b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
17b70 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
17b80 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
17b90 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
17ba0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
17bb0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
17bc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
17bd0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
17be0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
17bf0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17c00 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
17c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17c20 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
17c30 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
17c40 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
17c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17c60 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
17c70 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
17c80 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
17c90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17ca0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
17cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
17cc0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
17cd0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
17ce0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
17cf0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
17d00 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17d10 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
17d20 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
17d30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
17d40 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17d50 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
17d60 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
17d70 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
17d80 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17d90 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
17da0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17db0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17dc0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17de0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17df0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
17e00 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
17e10 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
17e20 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
17e30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
17e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17e50 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
17e60 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
17e70 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17e80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17e90 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
17ea0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
17eb0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
17ec0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17ed0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
17ee0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
17ef0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17f00 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
17f10 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
17f20 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
17f30 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
17f40 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
17f50 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
17f60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17f70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17f80 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
17f90 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
17fa0 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73  as not set the s
17fb0 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20  afety-level for 
17fc0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
17fd0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e  nnection.** usin
17fe0 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  g "PRAGMA synchr
17ff0 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74  onous", and if t
18000 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
18010 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
18020 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  * set to the val
18030 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
18040 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68  s function as th
18050 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
18060 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f  er,.** set it so
18070 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
18080 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18090 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41  OUS!=SQLITE_DEFA
180a0 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
180b0 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  OUS.static void 
180c0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
180d0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
180e0 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
180f0 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
18100 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
18110 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
18120 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
18130 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
18140 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
18150 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18160 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18170 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
18180 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
18190 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
181a0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
181b0 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
181c0 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
181d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
181e0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
181f0 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
18200 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18210 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18220 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18230 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18240 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18250 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18260 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
18270 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18280 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
18290 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
182a0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
182b0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
182c0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
182d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
182e0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
182f0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
18300 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
18310 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
18320 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18330 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
18340 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
18350 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
18360 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
18370 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
18380 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
18390 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
183a0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
183b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
183c0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
183d0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
183e0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
183f0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
18400 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
18410 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
18420 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18430 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18440 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
18450 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
18460 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
18470 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
18480 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
18490 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
184a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
184b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
184c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
184d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
184e0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
184f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18500 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18510 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18520 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
18530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18540 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18550 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
18560 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
18570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18580 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18590 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
185a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
185b0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
185c0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
185d0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
185e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18600 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
18610 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
18620 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
18630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18640 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18650 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
18660 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
18670 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
18680 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
18690 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
186a0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
186b0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
186c0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
186d0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
186e0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
186f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18700 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
18710 6e 50 61 67 65 46 69 6c 65 29 3b 0a 23 69 66 64  nPageFile);.#ifd
18720 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
18730 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 73  _EDITION.  if( s
18740 71 6c 69 74 65 33 50 61 67 65 72 49 73 53 65 72  qlite3PagerIsSer
18750 76 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ver(pBt->pPager)
18760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
18770 61 67 65 72 53 65 74 50 61 67 65 63 6f 75 6e 74  agerSetPagecount
18780 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 50  (pBt->pPager, nP
18790 61 67 65 29 3b 0a 20 20 20 20 6e 50 61 67 65 46  age);.    nPageF
187a0 69 6c 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  ile = nPage;.  }
187b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 50  .#endif.  if( nP
187c0 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
187d0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
187e0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
187f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
18800 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
18810 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
18820 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
18830 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
18840 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
18850 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
18860 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
18870 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
18880 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
18890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
188a0 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
188b0 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
188c0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
188d0 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
188e0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
188f0 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
18900 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
18910 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
18920 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
18930 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
18940 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
18950 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
18960 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
18970 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18980 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18990 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
189a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
189b0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
189c0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
189d0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
189e0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
189f0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
18a00 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
18a10 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18a20 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
18a30 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
18a40 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
18a50 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18a60 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18a70 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
18a80 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
18a90 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18aa0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
18ab0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
18ac0 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
18ad0 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
18ae0 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
18af0 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
18b00 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
18b10 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
18b20 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
18b30 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
18b40 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
18b50 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
18b60 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
18b70 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
18b80 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
18b90 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
18ba0 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
18bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
18bc0 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
18bd0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
18be0 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
18bf0 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
18c00 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
18c10 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
18c20 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
18c30 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
18c40 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
18c50 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
18c60 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
18c70 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
18c80 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
18c90 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
18ca0 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
18cb0 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
18cc0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
18cd0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
18ce0 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
18cf0 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
18d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18d20 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18d30 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18d40 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44 65 66  {.        setDef
18d50 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
18d60 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
18d70 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
18d80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
18d90 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
18da0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
18db0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
18dc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
18dd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
18de0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18df0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18e00 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ADB;.    }else{.
18e10 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
18e20 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
18e30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
18e40 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20  CHRONOUS+1);.   
18e50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
18e60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18e70 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65  -15465-20813 The
18e80 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e   maximum and min
18e90 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61  imum embedded pa
18ea0 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61  yload.    ** fra
18eb0 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c  ctions and the l
18ec0 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
18ed0 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74  tion values must
18ee0 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20   be 64, 32, and 
18ef0 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  32..    **.    *
18f00 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
18f10 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
18f20 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
18f30 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
18f40 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
18f50 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
18f60 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
18f70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18f80 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
18f90 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
18fa0 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
18fb0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18fc0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18fd0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18fe0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
18ff0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
19000 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
19010 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
19020 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
19030 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
19040 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
19050 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
19060 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
19070 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
19080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19090 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20  */.    pageSize 
190a0 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
190b0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
190c0 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  6);.    /* EVIDE
190d0 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d  NCE-OF: R-25008-
190e0 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f  21688 The size o
190f0 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f  f a page is a po
19100 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a  wer of two.    *
19110 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  * between 512 an
19120 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76  d 65536 inclusiv
19130 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  e. */.    if( ((
19140 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
19150 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
19160 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
19170 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
19180 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
19190 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
191a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
191b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
191c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
191d0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
191e0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
191f0 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35  CE-OF: R-59310-5
19200 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76  1205 The "reserv
19210 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69  ed space" size i
19220 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20  n the 1-byte.   
19230 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f   ** integer at o
19240 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20  ffset 20 is the 
19250 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19260 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
19270 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61  end of.    ** ea
19280 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72  ch page to reser
19290 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ve for extension
192a0 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s. .    **.    *
192b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
192c0 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
192d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
192e0 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
192f0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
19300 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
19310 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
19320 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
19330 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
19340 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
19350 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
19360 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53  . */.    usableS
19370 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
19380 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
19390 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
193a0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
193b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
193c0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
193d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
193e0 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
193f0 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
19400 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
19410 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
19420 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
19430 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
19440 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
19450 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
19460 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
19470 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
19480 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
19490 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
194a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
194b0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
194c0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
194d0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
194e0 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
194f0 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
19500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
19510 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
19520 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
19530 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19540 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
19550 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
19560 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
19570 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
19580 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19590 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
195a0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
195b0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
195c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
195f0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
19600 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19610 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
19620 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
19630 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
19640 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
19650 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
19660 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
19670 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
19680 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19690 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
196a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
196b0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
196c0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
196d0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
196e0 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
196f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
19700 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
19710 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
19720 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
19730 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
19740 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
19750 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
19760 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
19770 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
19780 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
19790 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
197a0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
197b0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
197c0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
197d0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
197e0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
197f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
19800 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
19810 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
19820 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
19830 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
19840 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
19850 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
19860 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
19870 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
19880 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
19890 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
198a0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
198b0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
198c0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
198d0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
198e0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
198f0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
19900 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
19910 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
19920 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
19930 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
19940 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
19950 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
19960 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
19970 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
19980 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
19990 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
199a0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
199b0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
199c0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
199d0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
199e0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
199f0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
19a00 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
19a10 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
19a20 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
19a30 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
19a40 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
19a50 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
19a60 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
19a70 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
19a80 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
19a90 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
19aa0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
19ab0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
19ac0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
19ad0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
19ae0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
19af0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
19b00 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
19b10 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
19b20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
19b30 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
19b40 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
19b50 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
19b60 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
19b70 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
19b80 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
19b90 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
19ba0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
19bb0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
19bc0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
19bd0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
19be0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
19bf0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
19c00 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
19c10 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
19c20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
19c30 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
19c40 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
19c50 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
19c60 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
19c70 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
19c80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19c90 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
19ca0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
19cb0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
19cc0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
19cd0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
19ce0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
19cf0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
19d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
19d10 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
19d20 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
19d30 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
19d40 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
19d50 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
19d60 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
19d70 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
19d80 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
19d90 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
19da0 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
19db0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
19dc0 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
19dd0 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
19de0 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
19df0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
19e00 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
19e10 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
19e20 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
19e30 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
19e40 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
19e50 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
19e60 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
19e70 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
19e80 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
19e90 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
19ea0 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
19eb0 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
19ec0 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
19ed0 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
19ee0 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
19ef0 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
19f00 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
19f10 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
19f20 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
19f30 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
19f40 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
19f50 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
19f60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
19f70 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
19f80 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
19f90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
19fa0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
19fb0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
19fc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
19fd0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
19fe0 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
19ff0 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
1a000 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
1a010 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1a020 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
1a030 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1a040 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
1a050 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1a060 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
1a070 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
1a080 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
1a090 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
1a0a0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
1a0b0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
1a0c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1a0d0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
1a0e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
1a0f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a100 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1a110 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
1a120 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
1a130 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
1a140 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1a150 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1a160 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1a170 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1a180 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
1a190 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a1a0 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
1a1b0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
1a1c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a1d0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
1a1e0 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
1a1f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1a200 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
1a210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
1a220 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
1a230 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1a240 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
1a250 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
1a260 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1a270 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
1a280 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31  geNotNull(pPage1
1a290 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a2a0 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
1a2b0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
1a2c0 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
1a2d0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
1a2e0 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
1a2f0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
1a300 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
1a310 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
1a320 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1a330 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1a340 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
1a350 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
1a360 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
1a370 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
1a380 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1a390 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a3a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1a3b0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
1a3c0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
1a3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a3e0 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
1a3f0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
1a400 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
1a410 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
1a420 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a430 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
1a440 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1a450 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a460 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
1a470 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
1a480 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1a490 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
1a4a0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
1a4b0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
1a4c0 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
1a4d0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
1a4e0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
1a4f0 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1a500 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
1a510 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
1a520 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
1a530 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
1a540 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
1a550 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
1a560 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
1a570 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
1a580 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
1a590 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
1a5a0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
1a5b0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a5c0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
1a5d0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
1a5e0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
1a5f0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
1a600 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
1a610 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
1a620 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
1a630 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
1a640 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1a650 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
1a660 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
1a670 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a680 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
1a690 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
1a6a0 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
1a6b0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
1a6c0 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
1a6d0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1a6e0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
1a6f0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1a700 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
1a710 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1a720 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1a730 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
1a740 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
1a750 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
1a760 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
1a770 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1a780 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a790 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1a7a0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1a7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a7c0 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
1a7d0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
1a7e0 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
1a7f0 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
1a800 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
1a810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1a820 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
1a830 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1a840 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1a850 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1a860 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
1a870 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1a880 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a890 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
1a8a0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1a8b0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1a8c0 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
1a8d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a8e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1a900 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
1a910 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
1a920 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a930 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
1a940 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1a950 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
1a960 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
1a970 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
1a980 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
1a990 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
1a9a0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
1a9b0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
1a9c0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1a9d0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
1a9e0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
1a9f0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
1aa00 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1aa10 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
1aa20 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
1aa30 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
1aa40 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
1aa50 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
1aa60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
1aa70 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
1aa80 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
1aa90 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
1aaa0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
1aab0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
1aac0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1aad0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1aae0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1aaf0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
1ab00 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1ab10 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
1ab20 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1ab30 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
1ab40 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
1ab50 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
1ab60 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
1ab70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ab80 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
1ab90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1aba0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
1abb0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1abc0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
1abd0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1abe0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
1abf0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1ac00 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
1ac10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ac20 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
1ac30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
1ac40 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
1ac50 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
1ac60 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
1ac70 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
1ac80 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
1ac90 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
1aca0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1acb0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1acc0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
1acd0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1ace0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
1acf0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
1ad00 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
1ad10 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
1ad20 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
1ad30 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1ad40 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
1ad50 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1ad60 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
1ad70 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
1ad80 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
1ad90 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1ada0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
1adb0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
1adc0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
1add0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
1ade0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
1adf0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
1ae00 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
1ae10 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
1ae20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
1ae30 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
1ae40 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1ae50 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
1ae60 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
1ae70 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1ae80 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
1ae90 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
1aea0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
1aeb0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1aec0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
1aed0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
1aee0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
1aef0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
1af00 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
1af10 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
1af20 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
1af30 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
1af40 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
1af50 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
1af60 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
1af70 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
1af80 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
1af90 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1afa0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
1afb0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42  int wrflag){.  B
1afc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1afd0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1afe0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1aff0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b000 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1b010 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1b020 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1b030 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1b040 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1b050 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1b060 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1b070 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1b080 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1b090 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1b0a0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1b0b0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1b0c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b0d0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1b0e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b0f0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1b100 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1b110 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1b120 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1b130 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b140 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1b150 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1b160 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1b170 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
1b180 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
1b190 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
1b1a0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1b1b0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
1b1c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1b1d0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
1b1e0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
1b1f0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1b200 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
1b210 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
1b220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b230 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1b240 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1b250 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
1b260 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1b270 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1b280 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1b290 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1b2a0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
1b2b0 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
1b2c0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
1b2d0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
1b2e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
1b2f0 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
1b300 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1b310 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20  LOCKED..    */. 
1b320 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26     if( (wrflag &
1b330 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1b340 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b350 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d  E).     || (pBt-
1b360 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1b370 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20  PENDING)!=0.    
1b380 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  ){.      pBlock 
1b390 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
1b3a0 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  db;.    }else if
1b3b0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1b3c0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
1b3d0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  r;.      for(pIt
1b3e0 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1b3f0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1b400 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1b410 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1b420 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1b430 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1b440 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1b450 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b470 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1b480 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
1b490 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1b4a0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1b4b0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , pBlock);.     
1b4c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1b4d0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1b4e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  .      goto tran
1b4f0 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20  s_begun;.    }. 
1b500 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1b510 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
1b520 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
1b530 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
1b540 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
1b550 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
1b560 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
1b570 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
1b580 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
1b590 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
1b5a0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
1b5b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
1b5c0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
1b5d0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
1b5e0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1b5f0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
1b600 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
1b610 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1b620 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
1b630 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
1b640 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
1b650 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b660 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1b670 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
1b680 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
1b690 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
1b6a0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
1b6b0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
1b6c0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
1b6d0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
1b6e0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
1b6f0 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
1b700 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1b710 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
1b720 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
1b730 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
1b740 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1b750 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
1b760 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
1b770 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
1b780 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
1b790 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
1b7a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1b7b0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
1b7c0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
1b7d0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
1b7e0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
1b7f0 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
1b800 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
1b810 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
1b820 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1b830 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
1b840 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
1b850 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
1b860 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
1b870 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
1b880 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b890 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1b8a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1b8b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b8c0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1b8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b8e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1b8f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b910 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1b920 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
1b930 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
1b940 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1b950 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b970 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1b980 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1b990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b9a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1b9b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b9c0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1b9d0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1b9e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1b9f0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1ba00 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1ba10 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ba20 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1ba30 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1ba40 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1ba50 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
1ba60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ba70 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1ba80 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1ba90 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1baa0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1bab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bac0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1bad0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1bae0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1baf0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1bb00 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1bb10 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1bb20 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1bb30 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1bb40 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1bb50 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1bb60 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1bb70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1bb80 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1bb90 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1bba0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1bbb0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1bbc0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1bbd0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1bbe0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bbf0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1bc00 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1bc10 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1bc20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1bc30 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1bc40 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1bc50 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1bc60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1bc70 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1bc80 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1bc90 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1bca0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1bcb0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1bcc0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1bcd0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1bce0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1bcf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1bd00 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1bd10 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1bd20 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1bd30 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1bd40 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1bd50 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1bd60 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1bd70 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1bd80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bd90 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1bda0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1bdb0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1bdc0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1bdd0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1bde0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1bdf0 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1be00 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1be10 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1be20 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1be30 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1be40 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1be50 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1be60 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1be70 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1be80 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1be90 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1bea0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1beb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1bec0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1bed0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1bee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bf00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1bf10 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1bf20 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1bf30 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1bf40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bf50 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
1bf60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf70 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1bf80 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1bf90 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1bfa0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
1bfb0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
1bfc0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
1bfd0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
1bfe0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1bff0 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
1c000 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
1c010 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
1c020 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
1c030 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
1c040 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
1c050 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
1c060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c070 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
1c080 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
1c090 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
1c0a0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1c0b0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1c0c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c0d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c0e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c0f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c100 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1c110 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1c120 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1c130 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1c140 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1c150 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1c160 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1c170 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1c180 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1c190 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1c1a0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1c1b0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1c1c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c1d0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1c1e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1c1f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1c220 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1c230 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1c260 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1c270 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c2a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1c2b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1c2c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
1c2d0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1c2e0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1c2f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c300 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1c310 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1c320 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1c330 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1c340 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1c350 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1c360 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1c370 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1c380 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1c390 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1c3a0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1c3b0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1c3c0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1c3d0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1c3e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c3f0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1c400 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c410 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1c420 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1c430 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1c440 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1c450 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c460 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1c470 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1c480 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1c490 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1c4a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1c4b0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1c4c0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1c4d0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1c4e0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1c4f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c500 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1c510 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1c520 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1c530 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1c540 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1c550 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1c560 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1c570 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1c580 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1c590 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1c5a0 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1c5b0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1c5c0 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1c5d0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1c5e0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1c5f0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1c600 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1c610 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1c620 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1c630 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c640 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1c650 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1c660 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1c670 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1c6a0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1c6b0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1c6c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1c6d0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1c6e0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1c6f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1c700 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1c710 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c720 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1c730 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1c740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1c750 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1c760 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1c770 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1c780 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1c790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c7a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1c7b0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1c7c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1c7d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1c7e0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1c7f0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1c800 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c810 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1c820 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1c830 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1c840 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1c850 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1c860 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1c870 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1c880 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1c890 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c8a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c8b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
1c8c0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1c8d0 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
1c8e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1c8f0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
1c900 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  int rc;..    rc 
1c910 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1c920 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1c930 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1c940 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1c950 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1c960 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1c970 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1c980 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1c990 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1c9a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1c9b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1c9c0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1c9d0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1c9e0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1c9f0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1ca00 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1ca10 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
1ca20 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
1ca30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ca40 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1ca50 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
1ca60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1ca70 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1ca80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ca90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1caa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cab0 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
1cac0 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c  m==get4byte(pCel
1cad0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20  l+info.nSize-4) 
1cae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1caf0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  ut4byte(pCell+in
1cb00 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29  fo.nSize-4, iTo)
1cb10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1cb20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1cb30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cb50 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
1cb60 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
1cb70 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1cb80 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
1cb90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1cba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cbb0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1cbc0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
1cbd0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
1cbe0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
1cbf0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
1cc00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1cc10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1cc20 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
1cc30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cc40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1cc50 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1cc60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1cc70 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1cc80 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
1cc90 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
1cca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ccb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1ccc0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1ccd0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1cce0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1ccf0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1cd00 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1cd10 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1cd20 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1cd30 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1cd40 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1cd50 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1cd60 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1cd70 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1cd80 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1cd90 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1cda0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1cdb0 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1cdc0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1cdd0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1cde0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1cdf0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1ce00 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1ce10 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1ce20 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1ce30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ce40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1ce50 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1ce60 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1ce70 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1ce80 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1ce90 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1cea0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ceb0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1cec0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1ced0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1cee0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1cef0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1cf00 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1cf10 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1cf20 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1cf30 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1cf40 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1cf50 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1cf60 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1cf70 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1cf80 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1cf90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1cfa0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1cfb0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1cfc0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1cfd0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1cfe0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1cff0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1d000 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1d010 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1d020 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1d030 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1d040 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1d050 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d060 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d070 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1d080 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1d090 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1d0a0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1d0b0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1d0c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d0d0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d0e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1d0f0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1d100 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1d110 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1d120 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1d130 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1d140 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1d150 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1d160 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1d170 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1d180 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1d190 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1d1a0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1d1b0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1d1c0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1d1d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1d1e0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1d1f0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1d200 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1d210 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1d220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d230 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d240 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1d250 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1d260 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1d270 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1d280 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1d290 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1d2a0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1d2b0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1d2c0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1d2d0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1d2e0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1d2f0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1d300 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1d310 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1d320 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1d330 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1d340 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1d350 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1d360 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1d370 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1d380 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1d390 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1d3a0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1d3b0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1d3c0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1d3d0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1d3e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1d3f0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1d400 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1d410 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1d420 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1d430 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1d440 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1d450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d470 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1d480 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1d490 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1d4a0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1d4b0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1d4c0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1d4d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1d4e0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1d4f0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1d500 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1d510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d540 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d550 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1d560 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1d570 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1d580 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1d590 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1d5a0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1d5b0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1d5c0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1d5d0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1d5e0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1d5f0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1d600 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1d610 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1d620 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1d630 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1d640 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1d650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d670 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1d680 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d690 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1d6a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1d6b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d6d0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1d6e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d6f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1d700 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1d710 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1d720 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1d730 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1d740 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1d750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1d770 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1d780 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1d790 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1d7a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d7b0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1d7c0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1d7d0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1d7e0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1d7f0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1d800 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1d810 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1d820 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1d830 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1d840 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1d850 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1d860 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1d870 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1d880 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1d890 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1d8a0 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1d8b0 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1d8c0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1d8d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1d8e0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1d8f0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1d900 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1d910 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1d920 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1d930 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1d940 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1d950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1d960 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1d970 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1d980 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1d990 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1d9a0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1d9b0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1d9c0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1d9d0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1d9e0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1d9f0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1da00 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1da10 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1da20 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1da30 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1da40 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1da50 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1da60 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1da70 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1da80 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1da90 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1daa0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1dab0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1dac0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1dad0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1dae0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1daf0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1db00 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1db10 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1db20 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1db30 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1db40 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1db50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1db60 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1db70 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1db80 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1db90 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1dba0 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1dbb0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1dbc0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1dbd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dbe0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1dbf0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1dc00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1dc10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1dc20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1dc30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1dc40 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1dc50 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1dc60 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1dc70 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1dc80 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1dc90 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1dca0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1dcb0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1dcc0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1dcd0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1dce0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1dcf0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1dd00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1dd10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1dd20 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1dd30 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1dd40 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1dd50 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1dd60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1dd70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1dd80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1dd90 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1dda0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1ddb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ddc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ddd0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1dde0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ddf0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1de00 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1de10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1de20 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1de30 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1de40 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1de50 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1de60 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1de70 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1de80 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1de90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1dea0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1deb0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1dec0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1ded0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1dee0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1def0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1df00 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1df10 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1df20 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1df30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1df40 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1df50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1df60 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1df70 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1df80 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1df90 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1dfa0 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1dfb0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1dfc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dfd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1dfe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1dff0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1e000 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1e010 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1e020 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1e030 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1e040 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1e050 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1e060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1e070 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1e080 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1e090 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1e0a0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1e0b0 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1e0c0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1e0d0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1e0e0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1e0f0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1e100 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1e110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1e120 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1e130 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1e140 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1e150 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1e160 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1e170 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1e180 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e1a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e1b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1e1c0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1e1d0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1e1e0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1e1f0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1e200 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1e210 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1e220 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1e230 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1e240 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1e250 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1e260 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1e270 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1e280 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1e290 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1e2a0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1e2b0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1e2c0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1e2d0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1e2e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1e2f0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1e300 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1e310 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e320 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1e330 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1e340 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1e350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1e360 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1e370 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1e380 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1e390 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1e3a0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1e3b0 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1e3c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1e3d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1e3f0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1e400 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1e410 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1e420 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1e430 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1e440 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1e450 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1e460 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1e470 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1e480 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1e490 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1e4a0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1e4b0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1e4c0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1e4d0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1e4e0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e4f0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1e500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e510 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e520 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1e530 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1e540 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1e550 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1e560 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1e570 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1e580 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e590 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1e5a0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1e5b0 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1e5c0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1e5d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1e5e0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1e5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e600 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1e610 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1e620 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e630 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1e640 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1e650 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1e660 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1e670 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1e680 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1e690 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1e6a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1e6b0 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1e6c0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1e6d0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1e6e0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1e6f0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1e700 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1e710 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1e720 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e740 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1e750 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1e760 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1e770 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1e780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e790 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1e7a0 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1e7b0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1e7c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e7d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e7e0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1e7f0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1e800 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1e810 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1e820 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1e830 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1e840 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1e850 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1e860 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1e870 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1e880 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1e890 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1e8a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e8b0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1e8c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1e8d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1e8e0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1e8f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e900 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1e910 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1e920 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1e930 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1e940 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1e950 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1e960 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1e970 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1e980 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1e990 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1e9a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1e9b0 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1e9c0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1e9d0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1e9e0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1e9f0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1ea00 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1ea10 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1ea20 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1ea30 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1ea40 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1ea50 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ea60 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1ea70 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1ea80 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1ea90 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1eaa0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1eab0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1eac0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1ead0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1eae0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1eaf0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1eb00 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1eb10 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1eb20 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1eb30 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1eb40 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1eb50 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1eb60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1eb70 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1eb80 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1eb90 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1eba0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1ebb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1ebc0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1ebd0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1ebe0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1ebf0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1ec00 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1ec10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1ec20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ec30 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1ec40 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ec50 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1ec60 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1ec70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ec80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1ec90 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1eca0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1ecb0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1ecc0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1ecd0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1ece0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ecf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ed00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ed10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ed20 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1ed30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ed40 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ed50 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1ed60 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1ed70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1ed80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ed90 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1eda0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1edb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1edc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1edd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ede0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1edf0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1ee00 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1ee10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1ee20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1ee30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1ee40 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1ee50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ee60 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1ee70 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1ee80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1ee90 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1eea0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1eeb0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1eec0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1eed0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1eee0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1eef0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1ef00 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1ef10 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1ef20 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1ef30 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1ef40 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1ef50 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1ef60 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1ef70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ef80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ef90 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1efa0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1efb0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1efc0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1efd0 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
1efe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1eff0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1f000 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1f010 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1f020 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1f030 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1f040 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1f050 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1f060 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1f070 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f080 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1f090 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1f0a0 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1f0b0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1f0c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1f0d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1f0e0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1f0f0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1f100 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1f110 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1f120 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1f130 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1f140 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1f150 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1f160 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1f170 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1f180 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1f190 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1f1a0 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1f1b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f1c0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1f1d0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1f1e0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1f1f0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1f200 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1f210 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1f220 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1f230 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1f240 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1f250 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1f260 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1f270 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1f280 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1f290 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1f2a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f2b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1f2c0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1f2d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f2e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1f2f0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1f300 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1f310 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1f320 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1f330 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f340 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1f350 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1f360 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1f370 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1f380 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1f390 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1f3a0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1f3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1f3c0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1f3d0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1f3e0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1f3f0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1f400 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1f410 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1f420 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1f430 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1f440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f450 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1f460 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1f470 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1f480 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1f490 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f4a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f4b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1f4c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1f4d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f4e0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1f4f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1f500 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1f510 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f520 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1f530 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f540 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1f550 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1f560 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1f570 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1f580 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1f590 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1f5a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1f5b0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1f5c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f5d0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1f5e0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1f5f0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1f600 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1f610 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1f620 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1f630 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1f640 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1f650 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1f660 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1f670 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1f680 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1f690 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1f6a0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1f6b0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1f6c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1f6d0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1f6e0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1f6f0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1f700 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1f710 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1f720 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1f730 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1f740 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1f750 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1f760 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1f770 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1f780 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1f790 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1f7a0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1f7b0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1f7c0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1f7d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1f7e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1f7f0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1f800 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1f810 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1f820 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1f830 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1f840 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1f850 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1f860 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1f870 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1f880 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1f890 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1f8a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f8b0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1f8c0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1f8d0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1f8e0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1f8f0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1f900 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1f910 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f920 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1f930 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1f940 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1f950 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1f960 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1f970 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1f980 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1f990 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1f9a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1f9b0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1f9c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1f9d0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1f9e0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1f9f0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1fa00 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1fa10 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1fa20 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1fa30 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1fa40 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1fa50 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1fa60 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1fa70 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1fa80 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1fa90 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1faa0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1fab0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1fac0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1fad0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1fae0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1faf0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1fb00 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1fb10 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1fb20 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1fb30 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1fb40 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1fb50 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1fb60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1fb70 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1fb80 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1fb90 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1fba0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fbb0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1fbc0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1fbd0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1fbe0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1fbf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1fc00 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1fc10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fc20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1fc30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1fc40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1fc50 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1fc60 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1fc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fc80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fc90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fcb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fcc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1fcd0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1fce0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1fcf0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1fd00 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1fd10 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1fd20 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1fd30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1fd40 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1fd50 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1fd60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1fd70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1fd80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fd90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1fda0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1fdb0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1fdc0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1fdd0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1fde0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1fdf0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1fe00 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1fe10 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1fe20 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1fe30 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1fe40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1fe50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fe60 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1fe70 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1fe80 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1fe90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fea0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1feb0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1fec0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1fed0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1fee0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1fef0 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1ff00 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1ff10 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1ff20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1ff30 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1ff40 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1ff50 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1ff60 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1ff70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1ff80 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1ff90 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1ffa0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1ffb0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1ffc0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1ffd0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1ffe0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1fff0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
20000 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
20010 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
20020 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
20030 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
20040 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
20050 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
20060 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
20070 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
20080 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
20090 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
200a0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
200b0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
200c0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
200d0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
200e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
200f0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
20100 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
20110 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
20120 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
20130 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
20140 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
20150 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20160 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
20170 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
20180 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
20190 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
201a0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
201b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
201c0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
201d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
201e0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
201f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
20200 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
20210 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
20220 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
20230 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
20240 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
20250 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
20260 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
20270 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
20280 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
20290 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
202a0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
202b0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
202c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
202d0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
202e0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
202f0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
20300 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
20310 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
20320 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
20330 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
20340 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
20350 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
20360 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
20370 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
20380 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
20390 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
203a0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
203b0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
203c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
203d0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
203e0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
203f0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
20400 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
20410 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
20420 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
20430 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
20440 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
20450 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
20460 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
20470 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
20480 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
20490 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
204a0 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
204b0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
204c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
204d0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
204e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
204f0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
20500 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
20510 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
20520 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
20530 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
20540 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
20550 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
20560 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
20570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
20580 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
20590 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
205a0 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
205b0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
205c0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
205d0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
205e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
205f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
20600 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
20610 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
20620 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
20630 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
20640 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
20650 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20660 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20670 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
20680 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
20690 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
206a0 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
206b0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
206c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
206d0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
206e0 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
206f0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
20700 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
20710 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
20720 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
20730 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
20740 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
20750 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
20760 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
20770 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
20780 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
20790 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
207a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
207b0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
207c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
207d0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
207e0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
207f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20800 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
20810 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
20820 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
20830 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
20840 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
20850 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20860 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
20870 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
20880 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20890 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
208a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
208b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
208c0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
208d0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
208e0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
208f0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
20900 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
20910 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
20920 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
20930 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
20940 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
20950 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
20960 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
20970 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20980 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
20990 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
209a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
209b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
209c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
209d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
209e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
209f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
20a00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
20a10 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
20a20 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
20a30 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
20a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
20a50 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
20a60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20a70 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
20a80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20a90 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
20aa0 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
20ab0 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
20ac0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
20ad0 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
20ae0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
20af0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
20b00 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
20b10 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
20b20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
20b30 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
20b40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
20b50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20b60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
20b70 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
20b80 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
20b90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20ba0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
20bb0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
20bc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
20bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20be0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
20bf0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
20c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20c20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20c30 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
20c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20c50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20c60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
20c70 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
20c80 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
20c90 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
20ca0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
20cb0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
20cc0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
20cd0 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
20ce0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
20cf0 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
20d00 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
20d10 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
20d20 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
20d30 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
20d40 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
20d50 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
20d60 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
20d70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
20d80 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
20d90 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
20da0 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
20db0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
20dc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
20dd0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
20de0 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
20df0 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
20e00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20e10 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
20e20 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
20e30 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
20e40 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
20e50 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
20e60 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
20e70 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
20e80 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
20e90 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
20ea0 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
20eb0 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
20ec0 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
20ed0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
20ee0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
20ef0 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
20f00 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
20f10 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
20f20 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
20f30 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
20f40 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
20f50 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
20f60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
20f70 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
20f80 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
20f90 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
20fa0 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
20fb0 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
20fc0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
20fd0 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
20fe0 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
20ff0 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
21000 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
21010 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
21020 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
21030 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
21040 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
21050 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
21060 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
21070 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
21080 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
21090 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
210a0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
210b0 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
210c0 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
210d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
210e0 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
210f0 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
21100 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21110 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
21120 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
21130 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
21140 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
21150 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
21160 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
21170 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
21180 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
21190 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
211a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
211b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
211c0 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
211d0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
211e0 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
211f0 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
21200 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
21210 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21220 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
21230 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
21240 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
21250 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
21260 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
21270 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
21280 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21290 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
212a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
212b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
212c0 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
212d0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
212e0 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
212f0 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
21300 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
21310 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
21320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21330 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
21340 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
21350 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
21360 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
21370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21390 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
213a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
213b0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
213c0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
213d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
213e0 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
213f0 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
21400 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
21410 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
21420 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
21430 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21440 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
21450 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61  .        p->apPa
21460 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ge[i] = 0;.     
21470 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
21480 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21490 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
214a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
214b0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
214c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
214d0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
214e0 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
214f0 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
21500 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
21510 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
21520 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
21530 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
21540 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
21550 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
21560 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
21570 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
21580 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
21590 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
215a0 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
215b0 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
215c0 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
215d0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
215e0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
215f0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
21600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21610 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
21620 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
21630 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
21640 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
21650 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
21660 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
21670 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
21680 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
21690 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
216a0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
216b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
216c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
216d0 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
216e0 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
216f0 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
21700 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
21710 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
21720 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
21730 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
21740 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21750 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
21760 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
21770 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
21780 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
21790 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
217a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
217b0 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
217c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
217d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
217e0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
217f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
21800 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
21810 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
21820 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
21830 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
21840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
21850 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
21860 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
21870 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
21880 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
21890 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
218a0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
218b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
218c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
218d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
218e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
218f0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
21900 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
21910 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
21920 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
21930 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
21940 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
21950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
21960 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
21970 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
21980 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
21990 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
219a0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
219b0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
219c0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
219d0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
219e0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
219f0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
21a00 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
21a10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
21a20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
21a30 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
21a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21a50 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
21a60 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
21a70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
21a80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
21a90 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
21aa0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
21ab0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
21ac0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
21ad0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
21ae0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
21af0 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
21b00 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
21b10 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
21b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
21b30 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
21b40 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
21b50 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
21b60 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
21b70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21b80 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
21b90 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21ba0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21bb0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21bc0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21bd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21be0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
21c00 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
21c10 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
21c20 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
21c30 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
21c40 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
21c50 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
21c60 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
21c70 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
21c80 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
21c90 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
21ca0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
21cb0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
21cc0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
21cd0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
21ce0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
21cf0 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
21d00 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
21d10 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
21d20 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
21d30 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
21d40 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
21d50 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
21d60 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
21d70 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
21d80 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
21d90 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
21da0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
21db0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
21dc0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
21dd0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
21de0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
21df0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
21e00 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
21e10 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
21e20 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21e30 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
21e40 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
21e50 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
21e60 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
21e70 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
21e80 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
21e90 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
21ea0 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
21eb0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
21ec0 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
21ed0 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
21ee0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
21ef0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
21f00 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
21f10 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
21f20 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
21f30 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
21f40 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
21f50 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
21f60 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
21f70 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21f80 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
21f90 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
21fa0 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
21fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
21fc0 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
21fd0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21fe0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
21ff0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
22000 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
22010 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
22020 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
22030 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22040 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
22050 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22060 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
22070 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
22080 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
22090 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
220a0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
220b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
220c0 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
220d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
220e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
220f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
22100 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
22110 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
22120 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
22130 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
22140 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
22150 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
22160 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
22170 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
22180 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
22190 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
221a0 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
221b0 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
221c0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
221d0 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
221e0 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
221f0 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
22200 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
22210 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
22220 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
22230 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
22240 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
22250 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
22260 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
22270 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
22280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22290 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
222a0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
222b0 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
222c0 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
222d0 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
222e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
222f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
22300 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
22310 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
22320 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
22330 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
22340 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
22350 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
22360 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
22370 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
22380 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
22390 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
223a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
223b0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
223c0 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
223d0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
223e0 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
223f0 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
22400 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
22410 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
22420 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
22430 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
22440 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
22450 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
22460 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
22470 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
22480 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
22490 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
224a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
224b0 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
224c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
224d0 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
224e0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
224f0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
22500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22510 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
22520 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
22530 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
22540 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
22560 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
22570 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
22580 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
22590 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
225a0 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
225b0 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
225c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
225d0 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
225e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
225f0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  r(p);.    if( op
22600 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
22610 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  BACK ){.      rc
22620 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
22630 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
22640 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22670 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
22680 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
22690 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
226a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
226b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
226c0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
226d0 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
226e0 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
226f0 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
22700 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
22710 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
22720 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
22730 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
22740 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
22750 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
22760 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
22770 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
22780 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
22790 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
227a0 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
227b0 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
227c0 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
227d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
227e0 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
227f0 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
22800 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
22810 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
22820 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
22830 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
22840 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22850 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
22880 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
22890 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
228a0 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
228b0 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
228c0 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
228d0 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
228e0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
228f0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
22900 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
22910 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
22920 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
22930 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
22940 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
22950 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
22960 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
22970 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
22980 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
22990 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
229a0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
229b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
229c0 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
229d0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20  it of wrFlag is 
229e0 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
229f0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a  cursor can only.
22a00 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ** be used for r
22a10 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20  eading.  If the 
22a20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
22a30 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
22a40 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62   cursor.** can b
22a50 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
22a60 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ng or for writin
22a70 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
22a80 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
22a90 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65  g.** are also me
22aa0 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68  t.  These are th
22ab0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
22ac0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
22ad0 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72   order.** for wr
22ae0 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f  iting to be allo
22af0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
22b00 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
22b10 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
22b20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74  with wrFlag cont
22b30 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43  aining BTREE_WRC
22b40 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  SR.**.** 2:  Oth
22b50 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
22b60 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
22b70 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
22b80 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
22b90 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
22ba0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
22bb0 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
22bc0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
22bd0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
22be0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
22bf0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
22c00 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
22c10 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
22c20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
22c30 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
22c40 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
22c50 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
22c60 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
22c70 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
22c80 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
22c90 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
22ca0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
22cb0 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
22cc0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
22cd0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
22ce0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
22cf0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
22d00 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  e BTREE_FORDELET
22d10 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  E bit of wrFlag 
22d20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  may optionally b
22d30 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57  e set if BTREE_W
22d40 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20  RCSR.** is set. 
22d50 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73   If FORDELETE is
22d60 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
22d70 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
22d80 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
22d90 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  ** this cursor w
22da0 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
22db0 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20   to seek to and 
22dc0 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f  delete entries o
22dd0 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73  f an index.** as
22de0 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
22df0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
22e00 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45  nt.  The FORDELE
22e10 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  TE hint is not u
22e20 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69  sed by.** this i
22e30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
22e40 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65  But in a hypothe
22e50 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76  tical alternativ
22e60 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
22e70 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e   .** in which in
22e80 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
22e90 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
22ea0 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65  leted when corre
22eb0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a  sponding table.*
22ec0 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  * rows are delet
22ed0 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54  ed, the FORDELET
22ee0 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74  E flag is a hint
22ef0 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61   that all SEEK a
22f00 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65  nd DELETE.** ope
22f10 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20  rations on this 
22f20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f  cursor can be no
22f30 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41  -ops and all REA
22f40 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e  D operations can
22f50 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75   .** return a nu
22f60 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a  ll row (2-bytes:
22f70 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a   0x01 0x00)..**.
22f80 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
22f90 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
22fa0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
22fb0 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
22fc0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
22fd0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
22fe0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
22ff0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
23000 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
23010 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
23020 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
23030 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
23040 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23050 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
23060 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
23070 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
23080 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
23090 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
230a0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
230b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
230c0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
230d0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
23100 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
23110 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23130 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
23140 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
23150 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
23180 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
23190 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
231a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
231b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
231c0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
231d0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
231e0 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
231f0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23210 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
23220 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
23230 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23240 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
23250 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
23260 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
23270 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
232a0 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
232b0 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
232c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
232d0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
232e0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
232f0 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20   wrFlag==0 .    
23300 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54     || wrFlag==BT
23310 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20  REE_WRCSR .     
23320 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54    || wrFlag==(BT
23330 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f  REE_WRCSR|BTREE_
23340 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b  FORDELETE) .  );
23350 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
23360 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
23370 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
23380 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
23390 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
233a0 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
233b0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
233c0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
233d0 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
233e0 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
233f0 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
23400 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
23410 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
23420 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
23430 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
23440 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
23450 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
23460 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
23470 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77   pKeyInfo!=0, (w
23480 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20  rFlag?2:1)) );. 
23490 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
234a0 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
234b0 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
234c0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
234d0 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
234e0 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
234f0 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
23500 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
23510 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
23520 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
23530 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
23540 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
23550 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
23560 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
23570 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
23580 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
23590 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
235a0 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
235b0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
235c0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
235d0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
235e0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
235f0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
23600 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
23610 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
23620 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
23630 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
23640 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
23650 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
23660 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
23670 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
23680 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
23690 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
236a0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
236b0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
236c0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
236d0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
236e0 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
236f0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
23700 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
23710 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
23720 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
23730 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
23740 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
23750 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
23760 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
23770 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
23780 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
23790 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
237a0 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57   wrFlag ? BTCF_W
237b0 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20  riteFlag : 0;.  
237c0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
237d0 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
237e0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
237f0 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
23800 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
23810 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
23820 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
23830 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
23840 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
23850 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
23860 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
23870 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
23880 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
23890 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
238a0 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
238b0 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
238c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
238d0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
238e0 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
238f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
23900 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
23910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
23920 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
23930 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
23940 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
23950 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
23960 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
23970 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23980 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
23990 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
239a0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239d0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
239e0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23a10 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
23a20 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
23a30 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
23a60 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
23a70 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
23a80 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
23a90 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
23aa0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23ab0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
23ac0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
23ad0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
23b00 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
23b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
23b20 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
23b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
23b40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
23b50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
23b60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
23b70 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
23b80 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
23b90 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
23ba0 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
23bb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23bc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23bd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23be0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
23bf0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23c00 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
23c10 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
23c20 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
23c30 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
23c40 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
23c50 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
23c60 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
23c70 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
23c80 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23c90 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
23ca0 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
23cb0 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
23cc0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
23cd0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
23ce0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
23cf0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23d00 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
23d10 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
23d20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
23d30 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
23d40 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
23d50 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
23d60 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
23d70 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
23d80 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
23d90 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
23da0 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
23db0 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
23dc0 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
23dd0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
23de0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
23df0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
23e00 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
23e10 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
23e20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
23e30 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
23e40 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
23e50 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
23e60 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
23e70 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
23e80 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
23e90 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
23ea0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
23eb0 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
23ec0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
23ed0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
23ee0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
23ef0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
23f00 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
23f10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
23f20 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
23f30 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
23f40 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
23f50 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
23f60 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
23f70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
23f80 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
23f90 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
23fa0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
23fb0 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
23fc0 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
23fd0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
23fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
23ff0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
24000 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
24010 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
24020 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
24030 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
24040 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
24050 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
24060 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
24070 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
24080 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
24090 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
240a0 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
240b0 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
240c0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
240d0 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
240e0 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
240f0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
24100 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
24110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
24120 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
24130 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
24140 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
24150 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
24160 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
24170 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
24180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
24190 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
241a0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
241b0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
241c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
241d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
241e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
241f0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
24200 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
24210 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24220 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
24230 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
24240 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24250 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
24260 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
24270 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
24280 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
24290 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
242a0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
242b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
242c0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
242d0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
242e0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
242f0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
24300 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
24310 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
24320 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
24330 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
24340 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
24350 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
24360 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
24370 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
24380 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
24390 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
243a0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
243b0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
243c0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
243d0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
243e0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
243f0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
24400 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
24410 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
24420 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
24430 5d 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  ], pCur->ix, &in
24440 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
24450 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
24460 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
24470 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
24480 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
24490 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
244a0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
244b0 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
244c0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
244d0 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
244e0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
244f0 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
24500 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
24510 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
24520 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
24530 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
24540 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
24550 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ey;.    btreePar
24560 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
24570 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
24580 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  >ix,&pCur->info)
24590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
245a0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
245b0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
245c0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
245d0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
245e0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
245f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
24600 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
24610 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
24620 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
24630 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
24640 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
24650 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
24660 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
24670 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
24680 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
24690 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
246a0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
246b0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
246c0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
246d0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
246e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
246f0 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
24700 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
24710 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
24720 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24730 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
24740 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
24750 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24760 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
24770 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24780 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
24790 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
247a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
247b0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
247c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
247d0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
247e0 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69  ger key or "rowi
247f0 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  d" for a table b
24800 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tree..** This ro
24810 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61  utine is only va
24820 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  lid for a cursor
24830 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
24840 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69  g into a.** ordi
24850 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65  nary table btree
24860 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
24870 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e   points to an in
24880 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20  dex btree or.** 
24890 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20  is invalid, the 
248a0 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72  result of this r
248b0 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69  outine is undefi
248c0 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ned..*/.i64 sqli
248d0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
248e0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
248f0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
24900 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24910 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24920 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24930 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24940 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24950 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67  curIntKey );.  g
24960 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
24970 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
24980 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f  >info.nKey;.}../
24990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
249a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
249b0 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
249c0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
249d0 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
249e0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
249f0 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
24a00 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
24a10 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
24a20 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
24a30 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
24a40 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
24a50 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
24a60 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
24a70 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
24a80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
24a90 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
24aa0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
24ab0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
24ac0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
24ad0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
24ae0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
24af0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
24b00 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
24b10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
24b20 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
24b30 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
24b40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24b50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24b60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24b80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24b90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
24ba0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
24bb0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
24bc0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
24bd0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
24be0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24bf0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24c00 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24c10 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
24c20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
24c30 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
24c40 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
24c50 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24c60 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
24c70 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
24c80 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
24c90 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
24ca0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
24cb0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
24cc0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
24cd0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
24ce0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
24cf0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
24d00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
24d10 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24d20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
24d30 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
24d40 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
24d50 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
24d60 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
24d70 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
24d80 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
24d90 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
24da0 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
24db0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
24dc0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
24dd0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
24de0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
24df0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
24e00 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
24e10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
24e20 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
24e30 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
24e40 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
24e50 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
24e60 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
24e70 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
24e80 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
24e90 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
24ea0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
24eb0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
24ec0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
24ed0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
24ee0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
24ef0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
24f00 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
24f10 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
24f20 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
24f30 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
24f40 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
24f50 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
24f60 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
24f70 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
24f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24f90 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
24fa0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24fc0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24fd0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
24fe0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
24ff0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
25000 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25010 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
25020 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
25030 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25040 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
25050 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
25060 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
25070 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
25080 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
25090 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
250a0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
250b0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
250c0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
250d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
250e0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
250f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25100 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
25110 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
25120 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
25130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25140 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
25150 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
25160 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
25170 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
25180 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
25190 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
251a0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
251b0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
251c0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
251d0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
251e0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
251f0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
25200 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
25210 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
25220 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
25230 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
25240 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
25250 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
25260 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
25270 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
25280 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25290 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
252a0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
252b0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
252c0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
252d0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
252e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
252f0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
25300 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
25310 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
25320 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
25330 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
25340 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
25350 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
25360 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
25370 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
25380 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
25390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
253a0 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
253b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
253c0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
253d0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
253e0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
253f0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
25400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25410 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
25420 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
25430 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
25440 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25460 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
25470 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
25480 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
25490 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
254a0 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
254b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
254c0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
254d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
254e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
254f0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
25500 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
25510 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
25520 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
25530 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
25540 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
25550 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
25560 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25570 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
25580 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
25590 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
255a0 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
255b0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
255c0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
255d0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
255e0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
255f0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
25600 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
25610 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
25620 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
25630 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
25640 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
25650 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
25660 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
25670 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
25680 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
25690 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
256a0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
256b0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
256c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
256d0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
256e0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
256f0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
25700 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
25710 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
25720 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
25730 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
25740 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
25750 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
25760 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
25770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25780 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
25790 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
257a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
257b0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
257c0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
257d0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
257e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
257f0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
25800 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
25810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25820 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
25830 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25850 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
25860 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
25870 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
25880 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
25890 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
258a0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
258b0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
258c0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
258d0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
258e0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
258f0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
25900 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
25910 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25920 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
25930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25940 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
25950 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25960 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
25970 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
25980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
25990 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
259a0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
259b0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
259c0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
259d0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
259e0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
259f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25a00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25a10 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25a20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
25a30 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
25a40 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
25a50 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
25a60 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
25a70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
25a80 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
25a90 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
25aa0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
25ab0 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
25ac0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
25ad0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
25ae0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
25af0 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
25b00 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
25b10 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
25b20 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
25b30 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
25b40 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
25b50 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
25b60 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
25b70 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
25b80 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
25b90 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
25ba0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25bb0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25bc0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
25bd0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
25be0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
25bf0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
25c00 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
25c10 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
25c20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
25c30 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
25c40 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
25c50 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
25c60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
25c70 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
25c80 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
25c90 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
25ca0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
25cb0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
25cc0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
25cd0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
25ce0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
25cf0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
25d00 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
25d10 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
25d20 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
25d30 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
25d40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25d50 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
25d60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
25d70 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
25d80 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25d90 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25da0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
25db0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
25dc0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
25dd0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
25de0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
25df0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
25e00 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25e10 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25e20 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
25e30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25e40 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
25e50 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
25e60 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
25e70 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
25e80 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25e90 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25ea0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
25eb0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
25ec0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
25ed0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
25ee0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
25ef0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
25f00 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25f10 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25f20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25f30 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
25f40 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
25f50 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
25f60 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
25f70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
25f80 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25f90 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25fa0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
25fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
25fc0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
25fd0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
25fe0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
25ff0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
26000 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
26010 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
26020 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
26030 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
26040 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
26050 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
26060 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
26070 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
26080 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26090 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
260a0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
260b0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
260c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
260d0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
260e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
260f0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
26100 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
26110 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
26120 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
26130 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26140 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
26150 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
26160 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
26170 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
26180 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
26190 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
261a0 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
261b0 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
261c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
261d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
261e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
261f0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
26200 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
26210 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26220 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
26230 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
26240 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
26250 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
26260 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
26270 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
26280 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
26290 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
262a0 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
262b0 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
262c0 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
262d0 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
262e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
262f0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
26300 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
26310 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
26320 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
26330 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
26340 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
26350 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
26360 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
26370 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
26380 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
26390 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
263a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
263b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
263c0 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
263d0 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
263e0 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
263f0 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
26400 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
26410 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
26420 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26430 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
26440 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
26450 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
26460 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
26470 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
26480 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
26490 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
264a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
264b0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
264c0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
264d0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
264e0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
264f0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
26500 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
26510 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
26520 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
26530 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
26540 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
26550 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
26560 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
26570 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
26580 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
26590 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
265a0 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  cal;.  }...  if(
265b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
265c0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
265d0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
265e0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
265f0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
26600 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
26610 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
26620 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
26630 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
26640 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
26650 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
26660 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  cal]);..    /* I
26670 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  f the BtCursor.a
26680 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e  Overflow[] has n
26690 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
266a0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
266b0 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
266c0 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
266d0 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
266e0 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
266f0 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
26700 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
26710 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
26720 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
26730 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
26740 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
26750 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
26760 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
26770 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
26780 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
26790 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
267a0 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
267b0 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
267c0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
267d0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
267e0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
267f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26800 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
26810 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
26820 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
26830 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
26840 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
26850 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
26860 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
26870 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
26880 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
26890 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
268a0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
268b0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
268c0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
268d0 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
268e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
268f0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
26900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
26910 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26920 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
26930 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26940 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
26950 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
26960 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
26970 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
26980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26990 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
269a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
269b0 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
269c0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72  no));.      pCur
269d0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
269e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
269f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
26a00 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
26a10 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26a20 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
26a30 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
26a40 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
26a50 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
26a60 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
26a70 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
26a80 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
26a90 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a  y to it..      *
26aa0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
26ab0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
26ac0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
26ad0 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28          iIdx = (
26ae0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
26af0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61  ;.        nextPa
26b00 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
26b10 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
26b20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
26b30 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
26b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26b50 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
26b60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
26b70 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 );.    while( 
26b80 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
26b90 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
26ba0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
26bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26bc0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
26bd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26be0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
26bf0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
26c00 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
26c10 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
26c20 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
26c30 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
26c40 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
26c50 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
26c60 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
26c70 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
26c80 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
26c90 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
26ca0 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
26cb0 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
26cc0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
26cd0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
26ce0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
26cf0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
26d00 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
26d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
26d20 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
26d30 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
26d40 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
26d50 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
26d60 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26d70 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
26d80 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
26d90 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26da0 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
26db0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
26dc0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26dd0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
26de0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26df0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
26e00 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
26e10 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
26e20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
26e30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26e40 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
26e50 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26e60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26e70 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
26e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26e90 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
26ea0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
26eb0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
26ec0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26ed0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
26ee0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26f00 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
26f10 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26f20 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26f30 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26f40 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26f50 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26f60 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
26f70 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
26f80 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
26f90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
26fa0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
26fb0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
26fc0 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
26fd0 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68   /* File from wh
26fe0 69 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74  ich to do direct
26ff0 20 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a   overflow read *
27000 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  /.#endif.       
27010 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
27020 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
27030 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
27040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
27050 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
27060 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
27070 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
27080 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
27090 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
270a0 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
270b0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
270c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
270d0 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
270e0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
270f0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
27100 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
27110 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
27120 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
27130 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
27140 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
27150 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
27160 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
27170 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
27180 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
27190 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
271a0 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
271b0 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
271c0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
271d0 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
271e0 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
271f0 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
27200 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
27210 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
27220 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
27230 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27240 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
27250 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
27260 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
27270 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
27280 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
27290 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
272a0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
272b0 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
272c0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
272d0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
272e0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
272f0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
27300 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
27310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27320 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
27360 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
27370 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273a0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
273b0 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
273c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
273d0 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
273e0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20           /* (3) 
273f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
27400 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
27410 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
27420 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
27430 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
27440 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
27450 65 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42  e3PagerUseWal(pB
27460 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
27470 61 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35  age)       /* (5
27480 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
27490 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
274a0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274c0 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
274d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
274e0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
274f0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
27500 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
27510 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
27520 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
27530 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a   /* due to (6) *
27560 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
27570 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
27580 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27590 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
275a0 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
275b0 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
275c0 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
275d0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
275e0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
275f0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
27600 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
27610 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
27620 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
27630 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
27640 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
27650 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
27660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27670 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
27680 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
27690 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
276a0 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
276b0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
276c0 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
276d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
276e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
276f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27700 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
27710 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
27720 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
27730 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
27740 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
27750 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
27760 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
27770 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
27780 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
27790 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
277a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
277b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
277c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
277d0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
277e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
277f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27800 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
27810 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72    if( amt==0 ) r
27820 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27830 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
27840 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
27850 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
27860 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iIdx++;.    }. 
27870 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
27880 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27890 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
278a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
278b0 50 54 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  PT; /* Overflow 
278c0 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d 61  chain ends prema
278d0 74 75 72 65 6c 79 20 2a 2f 0a 20 20 7d 0a 20 20  turely */.  }.  
278e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
278f0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27900 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
27910 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
27920 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
27930 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
27940 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
27950 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
27960 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27970 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
27980 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27990 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
279a0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
279b0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
279c0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
279d0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
279e0 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
279f0 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27a00 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27a10 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
27a20 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
27a30 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27a40 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
27a50 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
27a60 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27a70 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
27a80 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
27a90 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27aa0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
27ab0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
27ac0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
27ad0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27ae0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27af0 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
27b00 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
27b10 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
27b20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
27b30 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
27b40 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
27b50 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
27b60 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
27b70 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
27b80 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
27b90 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
27ba0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
27bb0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
27bc0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
27bd0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
27be0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27c00 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
27c10 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
27c20 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
27c30 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
27c40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27c50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27c60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27c70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27c90 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27ca0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27cb0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
27cc0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
27cd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27ce0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27cf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
27d00 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
27d10 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
27d20 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
27d30 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
27d40 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
27d50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27d60 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
27d70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
27d80 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
27d90 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
27da0 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
27db0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
27dc0 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
27dd0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
27de0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27df0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
27e00 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
27e10 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
27e20 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
27e30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
27e40 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
27e50 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
27e60 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
27e70 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
27e80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27e90 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
27eb0 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
27ec0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27ed0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27ee0 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
27ef0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
27f00 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
27f10 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
27f20 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
27f30 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
27f40 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
27f50 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
27f60 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
27f70 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
27f80 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
27f90 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
27fa0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27fb0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
27fc0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27fd0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27fe0 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
27ff0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
28000 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
28010 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
28020 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
28030 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
28040 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
28050 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
28060 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
28070 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
28080 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
28090 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
280a0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
280b0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
280c0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
280d0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
280e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
280f0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
28100 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
28110 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
28120 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
28130 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
28140 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
28150 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
28160 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
28170 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
28180 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
28190 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
281a0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
281b0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
281c0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
281d0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
281e0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
281f0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
28200 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28210 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
28220 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
28230 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
28240 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
28250 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
28260 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
28270 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
28280 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
28290 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
282a0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
282b0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
282c0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
282d0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
282e0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
282f0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
28300 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
28310 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
28320 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
28330 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
28340 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
28350 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
28360 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
28370 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
28380 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
28390 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
283a0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
283b0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
283c0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
283d0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
283e0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
283f0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
28400 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
28410 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
28420 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
28430 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
28440 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
28450 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
28460 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
28470 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
28480 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
28490 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
284a0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
284b0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
284c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
284d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
284e0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
284f0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
28500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28510 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
28520 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
28530 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28540 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
28550 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28560 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28580 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
28590 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
285a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
285b0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
285c0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
285d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
285e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
285f0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
28600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28610 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
28620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28630 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28640 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
28650 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28660 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
28670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28680 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28690 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
286a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
286b0 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
286c0 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
286d0 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
286e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
286f0 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
28700 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
28710 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
28720 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
28730 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
28740 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
28750 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
28760 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
28770 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
28780 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
28790 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
287a0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
287b0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
287c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
287d0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
287e0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
287f0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
28800 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
28810 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
28820 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
28830 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
28840 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
28850 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
28860 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
28870 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
28880 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
28890 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
288a0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
288b0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
288c0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
288d0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
288e0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
288f0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
28900 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
28910 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
28920 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
28930 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
28940 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
28950 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
28960 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
28970 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
28980 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
28990 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
289a0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
289b0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
289c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
289d0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
289e0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
289f0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28a00 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
28a10 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
28a20 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
28a30 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28a40 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
28a50 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
28a60 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
28a70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28a80 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28a90 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28ab0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28ac0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28ad0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28ae0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
28af0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
28b00 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
28b10 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
28b20 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
28b30 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
28b40 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
28b50 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
28b60 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
28b70 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
28b80 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
28b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28ba0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28bb0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28bc0 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28bd0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28be0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
28bf0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28c00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28c10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28c20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28c40 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
28c50 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
28c60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28c70 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
28c80 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
28c90 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28ca0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
28cb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28cc0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
28cd0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28ce0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28cf0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28d00 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28d10 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
28d20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28d30 61 67 65 2b 2b 5d 20 3d 20 70 43 75 72 2d 3e 69  age++] = pCur->i
28d40 78 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  x;.  pCur->ix = 
28d50 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
28d60 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
28d70 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
28d80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28d90 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
28db0 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
28dc0 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
28dd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28de0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
28df0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
28e00 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
28e10 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
28e20 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
28e30 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
28e40 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
28e50 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
28e60 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
28e70 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
28e80 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
28e90 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
28ea0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
28eb0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
28ec0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
28ed0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
28ee0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
28ef0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
28f00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
28f10 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
28f20 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
28f30 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
28f40 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
28f50 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
28f60 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
28f70 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
28f80 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
28f90 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
28fc0 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
28fd0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
28fe0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
28ff0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
29000 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
29010 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29020 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29030 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29040 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
29050 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
29060 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29070 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
29080 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
29090 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
290a0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
290b0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
290c0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
290d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
290e0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
290f0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
29100 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
29110 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
29120 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
29130 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
29140 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
29150 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29160 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
29170 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
29180 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
29190 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
291a0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
291b0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
291c0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
291d0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
291e0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
291f0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
29200 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
29210 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29220 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29240 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29250 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29260 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
29270 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29280 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29290 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
292a0 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
292b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
292c0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
292d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
292e0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
292f0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
29300 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
29310 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
29320 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
29330 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
29340 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29350 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
29360 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
29370 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29380 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29390 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
293a0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
293b0 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  fl);.  pCur->ix 
293c0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
293d0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
293e0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
293f0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
29400 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
29410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29420 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
29430 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
29440 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
29450 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
29460 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
29470 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
29480 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
29490 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
294a0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
294b0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
294c0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
294d0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
294e0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
294f0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
29500 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
29510 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
29520 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
29530 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
29540 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
29550 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
29560 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
29570 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
29580 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
29590 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
295a0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
295b0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
295c0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
295d0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
295e0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
295f0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
29600 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
29610 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
29620 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
29630 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
29640 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
29650 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
29660 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
29670 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
29680 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29690 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
296a0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
296b0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
296c0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
296d0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
296e0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
296f0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
29700 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
29710 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
29720 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
29730 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
29740 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
29750 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
29760 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
29770 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29780 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29790 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
297a0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
297b0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
297c0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
297d0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
297e0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
297f0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
29800 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
29810 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
29820 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
29830 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
29840 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
29850 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29860 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
29870 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29880 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29890 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
298a0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
298b0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
298c0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
298d0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
298e0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
298f0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
29900 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29910 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
29920 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
29930 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
29940 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29950 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
29960 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
29970 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29980 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
29990 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
299a0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
299b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
299c0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
299d0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
299e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
299f0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
29a00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
29a10 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
29a20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
29a30 61 67 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  age ){.      do{
29a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29a50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29a60 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
29a70 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
29a80 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
29a90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29aa0 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20  Page--]);.      
29ab0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50  }while( pCur->iP
29ac0 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
29ad0 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
29ae0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
29af0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
29b00 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
29b10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29b20 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
29b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29b40 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
29b50 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
29b60 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
29b70 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
29b80 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
29b90 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
29ba0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
29bb0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
29bc0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
29bd0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
29be0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
29bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29c00 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29c10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29c20 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
29c30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
29c40 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
29c50 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
29c60 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
29c70 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
29c80 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
29c90 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
29ca0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
29cb0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
29cc0 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
29cd0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
29ce0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
29cf0 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
29d00 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
29d10 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
29d20 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
29d30 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
29d40 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
29d50 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
29d60 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
29d70 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
29d80 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
29d90 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
29da0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
29db0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
29dc0 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
29dd0 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
29de0 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
29df0 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
29e00 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
29e10 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
29e20 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
29e30 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
29e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
29e50 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
29e60 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
29e70 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
29e80 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
29e90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
29ea0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
29eb0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
29ec0 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
29ed0 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
29ee0 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
29ef0 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
29f00 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
29f10 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
29f20 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
29f30 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
29f40 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
29f50 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
29f60 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
29f70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
29f80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29f90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29fa0 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20    }..skip_init: 
29fb0 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30   .  pCur->ix = 0
29fc0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
29fd0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
29fe0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29ff0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2a000 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a010 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70  ValidOvfl);..  p
2a020 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
2a030 61 67 65 5b 30 5d 3b 0a 20 20 69 66 28 20 70 52  age[0];.  if( pR
2a040 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
2a050 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2a060 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2a070 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
2a080 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
2a090 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
2a0a0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
2a0b0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
2a0c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a0d0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
2a0e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
2a0f0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2a100 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2a110 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a120 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2a130 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2a140 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
2a150 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2a160 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a170 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2a180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2a1a0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2a1b0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
2a1c0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
2a1d0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
2a1e0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2a1f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2a200 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
2a210 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
2a220 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2a230 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
2a240 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
2a250 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
2a260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2a270 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
2a280 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a290 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2a2a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a2b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2a2c0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2a2d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a2e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a2f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a300 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a310 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
2a320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
2a330 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2a340 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a350 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
2a360 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2a370 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2a380 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2a390 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2a3a0 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a  ge, pCur->ix));.
2a3b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2a3c0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2a3d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a3e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2a3f0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2a400 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
2a410 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2a420 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
2a430 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
2a440 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2a450 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
2a460 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
2a470 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
2a480 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
2a490 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
2a4a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2a4b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
2a4c0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
2a4d0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
2a4e0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
2a4f0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
2a500 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
2a510 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2a520 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
2a530 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
2a540 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
2a550 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
2a560 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
2a570 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
2a580 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2a590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2a5a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
2a5b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2a5c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2a5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a5e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a5f0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
2a600 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a610 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a620 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a630 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a640 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
2a650 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
2a660 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a670 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
2a680 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2a690 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2a6a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2a6b0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
2a6c0 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2a6d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2a6e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
2a6f0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2a700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2a710 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2a720 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
2a730 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a740 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2a750 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2a760 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2a770 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
2a780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a790 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
2a7a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2a7b0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2a7c0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2a7d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2a7e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2a7f0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2a800 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2a810 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2a820 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2a830 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2a840 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2a850 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2a860 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
2a870 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2a880 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2a890 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2a8a0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2a8b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a8c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a8d0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2a8e0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2a8f0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
2a900 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2a910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a920 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2a930 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2a940 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
2a950 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a960 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2a970 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a980 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2a990 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2a9a0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2a9b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a9c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a9d0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2a9e0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2a9f0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2aa00 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2aa10 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2aa20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aa30 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2aa40 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
2aa50 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2aa60 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2aa70 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2aa80 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2aa90 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2aaa0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2aab0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2aac0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2aad0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2aae0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2aaf0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
2ab00 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2ab10 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2ab20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
2ab30 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ab40 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ab50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ab60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2ab70 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2ab80 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2ab90 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
2aba0 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
2abb0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
2abc0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
2abd0 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
2abe0 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2abf0 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
2ac00 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2ac10 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
2ac20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2ac30 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
2ac40 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
2ac50 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
2ac60 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
2ac70 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
2ac80 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2ac90 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
2aca0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
2acb0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2acc0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
2acd0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2ace0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
2acf0 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
2ad00 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
2ad10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2ad20 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d   pCur->ix==pCur-
2ad30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ad40 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
2ad50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2ad60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ad70 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
2ad80 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2ad90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2ada0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2adb0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2adc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2add0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
2ade0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2adf0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ae00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2ae10 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2ae20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ae30 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2ae40 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2ae50 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2ae60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2ae70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ae80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
2ae90 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2aea0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2aeb0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2aec0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2aed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2aee0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2aef0 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
2af00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2af10 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2af20 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2af30 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Last;.      }.  
2af40 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
2af50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2af60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
2af70 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2af80 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
2af90 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
2afa0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
2afb0 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
2afc0 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
2afd0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
2afe0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
2aff0 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
2b000 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
2b010 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
2b020 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
2b030 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
2b040 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
2b050 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
2b060 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
2b070 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
2b080 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
2b090 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2b0a0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
2b0b0 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
2b0c0 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
2b0d0 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
2b0e0 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
2b0f0 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
2b100 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
2b110 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
2b120 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
2b130 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
2b140 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
2b150 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
2b160 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
2b170 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
2b180 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
2b190 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
2b1a0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
2b1b0 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
2b1c0 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
2b1d0 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
2b1e0 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
2b1f0 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
2b200 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2b210 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
2b220 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2b230 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b240 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2b250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b260 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
2b270 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2b280 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
2b290 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2b2b0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
2b2c0 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
2b2d0 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
2b2e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
2b2f0 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
2b300 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2b310 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2b320 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2b330 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
2b340 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
2b350 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2b360 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
2b370 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2b380 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2b390 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
2b3c0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2b3d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
2b3e0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64   tables, the pId
2b3f0 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65  xKey->eqSeen fie
2b400 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ld is set to 1 i
2b410 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74  f there.** exist
2b420 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  s an entry in th
2b430 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61  e table that exa
2b440 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64  ctly matches pId
2b450 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  xKey.  .*/.int s
2b460 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2b470 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
2b480 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2b490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2b4a0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
2b4b0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
2b4c0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
2b4d0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
2b4e0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
2b4f0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
2b500 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
2b510 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
2b520 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
2b530 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
2b540 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
2b550 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
2b560 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
2b570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2b580 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
2b590 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
2b5a0 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
2b5b0 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
2b5c0 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
2b5d0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b5e0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b5f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b600 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2b610 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2b620 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2b630 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
2b640 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
2b650 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
2b660 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  o==0) );.  asser
2b670 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
2b680 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2b690 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2b6a0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21  pCur->curIntKey!
2b6b0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2b6c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2b6d0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
2b6e0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
2b6f0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
2b700 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
2b710 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
2b720 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
2b730 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49  work */.  if( pI
2b740 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70  dxKey==0.   && p
2b750 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b760 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
2b770 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2b780 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
2b790 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0.  ){.    if( p
2b7a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2b7b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b7c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2b7d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b7e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2b7f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2b800 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2b810 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2b820 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2b830 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  st)!=0 ){.      
2b840 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2b850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b860 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2b870 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2b880 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73  requested key is
2b890 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
2b8a0 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c  he previous key,
2b8b0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   then.      ** t
2b8c0 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20  ry to get there 
2b8d0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72  using sqlite3Btr
2b8e0 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20  eeNext() rather 
2b8f0 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20  than a full.    
2b900 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72    ** binary sear
2b910 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ch.  This is an 
2b920 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
2b930 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20  y.  The correct 
2b940 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20  answer.      ** 
2b950 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65  is still obtaine
2b960 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 61  d without this a
2b970 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c  se, only a littl
2b980 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a  e more slowely *
2b990 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
2b9a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69  ->info.nKey+1==i
2b9b0 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e  ntKey && !pCur->
2b9c0 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2b9d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b9e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b9f0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2ba00 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 20 20  r, pRes);.      
2ba10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ba20 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
2ba30 28 20 2a 70 52 65 73 3d 3d 30 20 29 7b 0a 20 20  ( *pRes==0 ){.  
2ba40 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2ba50 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2ba60 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2ba70 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2ba80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ba90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2baa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2bad0 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2bae0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2baf0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2bb00 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2bb10 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2bb20 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2bb30 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2bb40 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2bb50 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2bb60 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2bb70 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2bb80 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2bb90 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2bba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2bbb0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2bbc0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2bbd0 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2bbe0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2bbf0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2bc00 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2bc10 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2bc20 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2bc30 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2bc40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bc50 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
2bc60 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2bc70 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2bc80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
2bc90 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2bca0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2bcb0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2bcc0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2bcd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2bce0 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
2bcf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2bd00 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2bd10 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2bd20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bd30 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2bd40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2bd50 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2bd60 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
2bd70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2bd80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2bd90 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2bda0 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2bdb0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2bdc0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2bdd0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2bde0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2bdf0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2be00 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2be10 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2be20 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2be30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2be40 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
2be50 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be70 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2be80 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2be90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2bea0 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2beb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2bec0 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2bed0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2bee0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2bef0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2bf00 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2bf10 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2bf20 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2bf30 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2bf40 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2bf50 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2bf60 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2bf70 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2bf80 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2bf90 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2bfa0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2bfb0 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2bfc0 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2bfd0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2bfe0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2bff0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2c000 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2c010 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2c020 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2c030 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2c040 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2c050 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2c060 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2c070 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2c080 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2c090 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2c0a0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2c0b0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2c0c0 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2c0d0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2c0e0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2c0f0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2c100 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2c110 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2c120 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2c130 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2c140 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2c150 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2c160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2c170 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2c180 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2c190 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2c1a0 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2c1b0 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2c1c0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2c1d0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2c1e0 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2c1f0 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2c200 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c210 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2c220 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
2c230 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c240 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2c250 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c260 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2c270 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2c280 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2c290 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2c2a0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2c2b0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2c2c0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2c2d0 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2c2e0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2c2f0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2c300 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2c310 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2c320 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2c330 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2c340 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2c350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2c370 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2c380 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2c390 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2c3a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2c3b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c3c0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2c3d0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2c3e0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2c3f0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2c400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c410 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2c420 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2c430 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2c440 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2c450 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2c460 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2c470 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2c480 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  0;.            *
2c490 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2c4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c4b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2c4c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c4d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2c4e0 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2c4f0 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2c500 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2c510 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2c520 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2c530 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2c540 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2c550 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2c560 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2c570 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2c580 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2c590 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2c5a0 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2c5b0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2c5c0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2c5d0 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2c5e0 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2c5f0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2c600 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2c610 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2c620 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2c630 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2c640 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2c650 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2c660 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2c670 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2c680 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2c690 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2c6a0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2c6b0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2c6c0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2c6d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2c6e0 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2c6f0 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2c700 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2c710 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2c720 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2c730 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2c740 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2c750 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2c760 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2c770 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2c780 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2c790 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2c7a0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2c7b0 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2c7c0 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2c7d0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2c7e0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2c7f0 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2c800 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2c810 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2c820 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2c830 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2c840 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2c850 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2c860 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2c870 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2c880 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2c890 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2c8a0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2c8b0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2c8c0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2c8d0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2c8e0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2c8f0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2c900 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2c910 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2c920 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2c930 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2c940 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2c950 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2c960 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2c970 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2c980 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2c990 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2c9a0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2c9b0 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2c9c0 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2c9d0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2c9e0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2c9f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2ca00 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2ca10 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2ca20 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2ca30 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2ca40 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2ca50 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2ca60 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2ca70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2ca80 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2ca90 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2caa0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2cab0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2cac0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2cad0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2cae0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2caf0 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2cb00 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2cb10 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2cb20 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2cb30 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2cb40 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2cb50 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2cb60 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2cb70 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2cb80 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2cb90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2cba0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2cbb0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2cbc0 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2cbd0 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2cbe0 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2cbf0 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2cc00 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2cc10 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2cc20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2cc30 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2cc40 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2cc50 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2cc60 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2cc70 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2cc80 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2cc90 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2cca0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2ccb0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2ccc0 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2ccd0 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2cce0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2ccf0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2cd00 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2cd10 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2cd20 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2cd30 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2cd40 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2cd50 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2cd60 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2cd70 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2cd80 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2cd90 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2cda0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cdb0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2cdc0 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2cdd0 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2cde0 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2cdf0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2ce00 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2ce10 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2ce20 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2ce30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ce40 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2ce50 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2ce60 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2ce70 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2ce80 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20  nCell<2 ){.     
2ce90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2cea0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ceb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2cec0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2ced0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cee0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2cef0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2cf00 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2cf10 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2cf20 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2cf30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cf40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2cf50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2cf60 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2cf70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf80 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2cf90 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2cfa0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2cfb0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2cfc0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2cfd0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2cfe0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2cff0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2d000 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2d010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d020 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2d030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2d040 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2d050 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d060 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2d070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2d080 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2d090 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2d0a0 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2d0b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d0c0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2d0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d0e0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2d0f0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2d100 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2d110 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2d120 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2d130 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2d140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2d150 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2d160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2d170 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2d180 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2d190 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2d1a0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2d1b0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2d1c0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2d1d0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2d1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2d1f0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2d200 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2d220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2d230 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2d240 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2d250 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2d260 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2d270 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2d280 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d290 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2d2a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d2b0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2d2c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2d2d0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2d2e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2d2f0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2d300 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2d310 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2d320 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2d330 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2d340 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2d350 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2d360 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2d370 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2d380 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2d390 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2d3a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2d3b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d3c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2d3d0 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2d3e0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d3f0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2d400 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d410 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2d420 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2d430 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2d440 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2d450 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2d460 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2d470 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2d480 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2d490 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2d4a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d4b0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2d4c0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2d4d0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2d4e0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  }.    pCur->ix =
2d4f0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2d500 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2d510 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2d520 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2d530 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2d540 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2d550 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2d560 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2d570 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2d580 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2d590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d5a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2d5b0 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2d5c0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2d5d0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2d5e0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2d5f0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2d600 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2d610 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2d620 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2d630 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2d640 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2d650 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2d660 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2d670 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2d680 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2d690 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2d6a0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2d6b0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2d6c0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2d6d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2d6e0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2d6f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2d700 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2d710 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2d720 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2d730 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2d740 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2d750 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2d760 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2d770 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2d780 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2d790 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2d7a0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2d7b0 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2d7c0 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2d7d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2d7e0 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74  n estimate for t
2d7f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
2d800 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
2d810 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70  hat pCur is.** p
2d820 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74  ointing to.  Ret
2d830 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2d840 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69  umber if no esti
2d850 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c  mate is currentl
2d860 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  y .** available.
2d870 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
2d880 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28  treeRowCountEst(
2d890 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2d8a0 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69  .  i64 n;.  u8 i
2d8b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d8c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d8d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d8e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d8f0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2d900 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2d910 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  ;..  /* Currentl
2d920 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65  y this interface
2d930 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2d940 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c  by the OP_IfSmal
2d950 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c  ler.  ** opcode,
2d960 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73   and it that cas
2d970 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  e the cursor wil
2d980 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69  l always be vali
2d990 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  d and.  ** will 
2d9a0 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20  always point to 
2d9b0 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a  a leaf node. */.
2d9c0 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
2d9d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d9e0 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e  _VALID) ) return
2d9f0 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   -1;.  if( NEVER
2da00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
2da10 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2da20 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31  ==0) ) return -1
2da30 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31 2c 20 69 3d  ;..  for(n=1, i=
2da40 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
2da50 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a  e; i++){.    n *
2da60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
2da70 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  ]->nCell;.  }.  
2da80 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
2da90 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2daa0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2dab0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2dac0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2dad0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2dae0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2daf0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2db00 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2db10 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
2db20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2db30 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2db40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2db50 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2db60 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2db70 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2db80 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2db90 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2dba0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2dbb0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2dbc0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2dbd0 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2dbe0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2dbf0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2dc00 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2dc10 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2dc20 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2dc30 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2dc40 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2dc50 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2dc60 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2dc70 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2dc80 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2dc90 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2dca0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2dcb0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2dcc0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2dcd0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2dce0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2dcf0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2dd00 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2dd10 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2dd20 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2dd30 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2dd40 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2dd50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2dd60 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2dd70 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2dd80 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2dd90 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2dda0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2ddb0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2ddc0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2ddd0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2dde0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2ddf0 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2de00 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2de10 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2de20 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2de30 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2de40 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2de50 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2de60 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2de70 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2de80 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2de90 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2dea0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2deb0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2dec0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2ded0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2dee0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2def0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2df00 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2df10 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2df20 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2df30 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2df40 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2df50 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2df60 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2df70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2df80 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2df90 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2dfa0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2dfb0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2dfc0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2dfd0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2dfe0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2dff0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2e000 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2e010 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2e020 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2e030 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2e040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2e060 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2e070 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2e080 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2e090 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2e0a0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2e0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e0c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2e0d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2e0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2e0f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2e100 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2e110 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2e120 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2e130 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e140 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2e150 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2e160 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2e170 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e180 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2e190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e1a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2e1b0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2e1c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2e1d0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2e1e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e1f0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2e200 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73 65  pCur->ix;.  asse
2e210 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2e220 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2e230 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e240 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2e250 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2e260 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2e270 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2e280 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2e290 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2e2a0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2e2b0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2e2c0 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2e2d0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2e2e0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2e2f0 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2e300 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2e310 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2e320 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2e330 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2e340 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2e350 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2e360 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2e370 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2e380 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2e390 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2e3a0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2e3b0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2e3c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e3d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2e3e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2e3f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2e400 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2e410 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2e420 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e430 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2e440 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2e450 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2e460 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2e470 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2e480 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2e490 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2e4a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2e4b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2e4c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e4d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2e4e0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2e4f0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2e500 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e510 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e520 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2e530 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e  ur->ix>=pPage->n
2e540 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2e550 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2e560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2e570 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2e580 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2e590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2e5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e5b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2e5c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e5e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2e5f0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2e600 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2e610 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2e620 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2e630 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2e640 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2e650 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2e660 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e670 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e680 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2e690 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2e6a0 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2e6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e6c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2e6d0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2e6e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e6f0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2e700 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2e710 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2e720 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2e730 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2e740 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2e750 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2e760 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2e770 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2e780 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2e790 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e7a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e7b0 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2e7c0 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >ix)>=pPage->nCe
2e7d0 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2e7e0 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  ix--;.    return
2e7f0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2e800 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2e810 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e820 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e830 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2e840 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e850 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e860 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2e870 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2e880 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2e890 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2e8a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2e8b0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2e8c0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2e8d0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2e8e0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2e8f0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2e900 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2e910 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2e920 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2e930 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2e940 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2e950 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2e960 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2e970 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2e980 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2e990 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2e9a0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2e9b0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2e9c0 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2e9d0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2e9e0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2e9f0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2ea00 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2ea10 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2ea20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2ea30 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2ea40 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2ea50 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2ea60 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2ea70 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2ea80 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2ea90 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2eaa0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2eab0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2eac0 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2ead0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2eae0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2eaf0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2eb00 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2eb10 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2eb20 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2eb30 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2eb40 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2eb50 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2eb60 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2eb70 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2eb80 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2eb90 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2eba0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2ebb0 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2ebc0 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2ebd0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2ebe0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2ebf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ec00 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2ec10 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2ec20 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2ec30 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2ec40 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2ec50 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2ec60 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2ec70 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2ec80 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2ec90 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2eca0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2ecb0 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2ecc0 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2ecd0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2ece0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2ecf0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2ed00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ed10 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2ed20 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2ed30 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2ed40 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ed50 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ed60 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2ed70 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2ed80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ed90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2eda0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2edb0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2edc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2edd0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2ede0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2edf0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2ee00 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2ee10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ee20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2ee30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2ee40 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ee50 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2ee60 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2ee70 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2ee80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2eea0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2eeb0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2eec0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2eed0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2eee0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2eef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ef00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2ef10 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2ef20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ef30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ef40 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2ef50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ef60 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2ef70 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ef80 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2ef90 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2efa0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2efb0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2efc0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2efd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2efe0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2eff0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f000 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2f010 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f020 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2f030 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2f040 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f050 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f060 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2f070 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  x = pCur->ix;.  
2f080 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2f090 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2f0a0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2f0b0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2f0c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f0d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2f0e0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2f0f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2f100 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d  hile( pCur->ix==
2f110 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2f120 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2f130 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2f140 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2f150 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2f160 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2f170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f180 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2f190 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2f1a0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2f1b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2f1c0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2f1d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2f1e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2f1f0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2f200 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2f210 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  >ix--;.    pPage
2f220 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f230 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2f240 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2f250 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2f260 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2f270 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2f280 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2f290 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2f2a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f2b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2f2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2f2d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2f2e0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2f2f0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2f300 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2f310 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f320 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f330 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2f340 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2f350 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2f360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f370 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2f380 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f390 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2f3a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2f3b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2f3c0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f3d0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2f3e0 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2f3f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2f400 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2f410 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f420 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2f430 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
2f440 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2f450 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2f460 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2f470 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2f480 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2f490 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72   pCur->ix--;.  r
2f4a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f4b0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2f4c0 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
2f4d0 0a 0a 23 64 65 66 69 6e 65 20 53 45 52 56 45 52  ..#define SERVER
2f4e0 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49 53  _DEFAULT_FREELIS
2f4f0 54 53 20 20 20 20 20 20 31 36 0a 23 64 65 66 69  TS      16.#defi
2f500 6e 65 20 53 45 52 56 45 52 5f 44 45 46 41 55 4c  ne SERVER_DEFAUL
2f510 54 5f 46 52 45 45 4c 49 53 54 5f 53 49 5a 45 20  T_FREELIST_SIZE 
2f520 31 32 38 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  128../*.** Alloc
2f530 61 74 65 20 74 68 65 20 66 72 65 65 2d 6e 6f 64  ate the free-nod
2f540 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2f550 53 45 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46  SERVER_DEFAULT_F
2f560 52 45 45 4c 49 53 54 53 20 0a 2a 2a 20 74 72 75  REELISTS .** tru
2f570 6e 6b 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  nk pages..*/.sta
2f580 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
2f590 53 65 72 76 65 72 46 72 65 65 6e 6f 64 65 28 42  ServerFreenode(B
2f5a0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
2f5b0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2f5c0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
2f5d0 2d 3e 70 50 61 67 65 31 3b 0a 0a 20 20 72 63 20  ->pPage1;..  rc 
2f5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f5f0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2f600 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
2f610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f620 20 50 67 6e 6f 20 70 67 6e 6f 4e 6f 64 65 20 3d   Pgno pgnoNode =
2f630 20 28 2b 2b 70 42 74 2d 3e 6e 50 61 67 65 29 3b   (++pBt->nPage);
2f640 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
2f650 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ode = 0;.    int
2f660 20 69 3b 0a 0a 20 20 20 20 70 75 74 34 62 79 74   i;..    put4byt
2f670 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f680 5b 33 32 5d 2c 20 70 67 6e 6f 4e 6f 64 65 29 3b  [32], pgnoNode);
2f690 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2f6a0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2f6b0 2c 20 70 67 6e 6f 4e 6f 64 65 2c 20 26 70 4e 6f  , pgnoNode, &pNo
2f6c0 64 65 2c 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  de, PAGER_GET_NO
2f6d0 43 4f 4e 54 45 4e 54 29 3b 0a 20 20 20 20 69 66  CONTENT);.    if
2f6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f6f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2f700 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f710 70 4e 6f 64 65 2d 3e 70 44 62 50 61 67 65 29 3b  pNode->pDbPage);
2f720 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2f730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f740 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f750 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 30 5d 2c  pNode->aData[0],
2f760 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
2f770 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74  yte(&pNode->aDat
2f780 61 5b 34 5d 2c 20 53 45 52 56 45 52 5f 44 45 46  a[4], SERVER_DEF
2f790 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 53 29 3b  AULT_FREELISTS);
2f7a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2f7b0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2f7c0 4b 20 26 26 20 69 3c 53 45 52 56 45 52 5f 44 45  K && i<SERVER_DE
2f7d0 46 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 53 3b  FAULT_FREELISTS;
2f7e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d   i++){.      Mem
2f7f0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2f800 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
2f810 6f 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  oTrunk;.      if
2f820 28 20 2b 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  ( ++pBt->nPage==
2f830 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f840 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
2f850 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 70 67 6e  age++;.      pgn
2f860 6f 54 72 75 6e 6b 20 3d 20 70 42 74 2d 3e 6e 50  oTrunk = pBt->nP
2f870 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  age;..      rc =
2f880 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2f890 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 54 72 75  age(pBt, pgnoTru
2f8a0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 50 41 47  nk, &pTrunk, PAG
2f8b0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
2f8c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2f8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f8e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f8f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2f900 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2f910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f930 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
2f940 28 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 2c 20  (pTrunk->aData, 
2f950 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 8);.        p
2f960 75 74 34 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e  ut4byte(&pNode->
2f970 61 44 61 74 61 5b 38 2b 69 2a 34 5d 2c 20 70 67  aData[8+i*4], pg
2f980 6e 6f 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  noTrunk);.      
2f990 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
2f9a0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  age(pTrunk);.   
2f9b0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
2f9c0 67 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a  ge(pNode);.  }..
2f9d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f9e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 72  /*.** Return a r
2f9f0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2fa00 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2fa10 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 64   in one of the d
2fa20 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2fa30 74 73 2e 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ts..** Allocate 
2fa40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72 65  the database fre
2fa50 65 2d 6c 69 73 74 73 20 69 66 20 72 65 71 75 69  e-lists if requi
2fa60 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2fa70 6e 74 20 66 69 6e 64 53 65 72 76 65 72 54 72 75  nt findServerTru
2fa80 6e 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nk(BtShared *pBt
2fa90 2c 20 69 6e 74 20 62 41 6c 6c 6f 63 2c 20 4d 65  , int bAlloc, Me
2faa0 6d 50 61 67 65 20 2a 2a 70 70 54 72 75 6e 6b 29  mPage **ppTrunk)
2fab0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2fac0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2fad0 31 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  1;.  MemPage *pN
2fae0 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ode = 0;        
2faf0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65       /* The node
2fb00 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
2fb10 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
2fb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fb30 65 20 72 65 74 75 72 6e 65 64 20 70 61 67 65 20  e returned page 
2fb40 2a 2f 0a 20 20 50 67 6e 6f 20 69 4e 6f 64 65 3b  */.  Pgno iNode;
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2fb70 62 65 72 20 6f 66 20 6e 6f 64 65 20 70 61 67 65  ber of node page
2fb80 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2fb90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2fba0 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 67 65  If the node page
2fbb0 20 61 6e 64 20 66 72 65 65 2d 6c 69 73 74 20 74   and free-list t
2fbc0 72 75 6e 6b 73 20 68 61 76 65 20 6e 6f 74 20 79  runks have not y
2fbd0 65 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  et been allocate
2fbe0 64 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  d, allocate.  **
2fbf0 20 74 68 65 6d 20 6e 6f 77 2e 20 20 2a 2f 0a 20   them now.  */. 
2fc00 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
2fc10 50 61 67 65 31 3b 0a 20 20 69 4e 6f 64 65 20 3d  Page1;.  iNode =
2fc20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2fc30 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2fc40 20 69 66 28 20 69 4e 6f 64 65 3d 3d 30 20 29 7b   if( iNode==0 ){
2fc50 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2fc60 74 65 53 65 72 76 65 72 46 72 65 65 6e 6f 64 65  teServerFreenode
2fc70 28 70 42 74 29 3b 0a 20 20 20 20 69 4e 6f 64 65  (pBt);.    iNode
2fc80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2fc90 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2fca0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 72 61 62 20  .  }..  /* Grab 
2fcb0 74 68 65 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f  the node page */
2fcc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2fce0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2fcf0 61 67 65 28 70 42 74 2c 20 69 4e 6f 64 65 2c 20  age(pBt, iNode, 
2fd00 26 70 4e 6f 64 65 2c 20 30 29 3b 0a 20 20 7d 0a  &pNode, 0);.  }.
2fd10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fd20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
2fd30 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
2fd40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fd50 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 73  er of free-lists
2fd60 20 69 6e 20 74 68 69 73 20 64 62 20 2a 2f 0a 20   in this db */. 
2fd70 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f     int i;..    /
2fd80 2a 20 54 72 79 20 74 6f 20 6c 6f 63 6b 20 61 20  * Try to lock a 
2fd90 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 2e  free-list trunk.
2fda0 20 49 66 20 62 41 6c 6c 6f 63 20 69 73 20 74 72   If bAlloc is tr
2fdb0 75 65 2c 20 69 74 20 68 61 73 20 74 6f 20 62 65  ue, it has to be
2fdc0 20 61 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c   a.    ** free-l
2fdd0 69 73 74 20 74 72 75 6e 6b 20 77 69 74 68 20 61  ist trunk with a
2fde0 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 6e 74 72  t least one entr
2fdf0 79 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  y in the free-li
2fe00 73 74 2e 20 2a 2f 0a 20 20 20 20 6e 4c 69 73 74  st. */.    nList
2fe10 20 3d 20 28 69 6e 74 29 67 65 74 34 62 79 74 65   = (int)get4byte
2fe20 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 34  (&pNode->aData[4
2fe30 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
2fe40 20 69 3c 6e 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a   i<nList; i++){.
2fe50 20 20 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e        Pgno iTrun
2fe60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4e  k = get4byte(&pN
2fe70 6f 64 65 2d 3e 61 44 61 74 61 5b 38 2b 69 2a 34  ode->aData[8+i*4
2fe80 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  ]);.      if( SQ
2fe90 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
2fea0 50 61 67 65 72 57 72 69 74 65 6c 6f 63 6b 28 70  PagerWritelock(p
2feb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 54 72 75  Bt->pPager, iTru
2fec0 6e 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nk) ){.        r
2fed0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2fee0 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
2fef0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2ff00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2ff10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41  =SQLITE_OK && bA
2ff20 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
2ff30 20 20 69 66 28 20 21 67 65 74 34 62 79 74 65 28    if( !get4byte(
2ff40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2ff50 5d 29 20 26 26 20 21 67 65 74 34 62 79 74 65 28  ]) && !get4byte(
2ff60 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2ff70 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
2ff80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2ff90 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2ffa0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2ffb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ffc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2ffd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2ffe0 7c 20 70 54 72 75 6e 6b 20 29 20 62 72 65 61 6b  | pTrunk ) break
2fff0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30000 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 72 65 65 20  .    /* No free 
30010 70 61 67 65 73 20 69 6e 20 61 6e 79 20 66 72 65  pages in any fre
30020 65 2d 6c 69 73 74 2e 20 4f 72 20 70 65 72 68 61  e-list. Or perha
30030 70 73 20 77 65 20 77 65 72 65 20 6c 6f 63 6b 65  ps we were locke
30040 64 20 6f 75 74 2e 20 49 6e 20 0a 20 20 20 20 2a  d out. In .    *
30050 2a 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  * either case, t
30060 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ry to allocate m
30070 6f 72 65 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ore from the end
30080 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e 6f 77   of the file now
30090 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d  .  */.    if( i=
300a0 3d 6e 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  =nList ){.      
300b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
300c0 54 45 5f 4f 4b 20 26 26 20 70 54 72 75 6e 6b 3d  TE_OK && pTrunk=
300d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
300e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
300f0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
30100 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ge);.      for(i
30110 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
30120 4b 20 26 26 20 69 3c 6e 4c 69 73 74 3b 20 69 2b  K && i<nList; i+
30130 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  +){.        /* A
30140 64 64 20 73 6f 6d 65 20 66 72 65 65 20 70 61 67  dd some free pag
30150 65 73 20 74 6f 20 65 61 63 68 20 66 72 65 65 2d  es to each free-
30160 6c 69 73 74 2e 20 4e 6f 20 73 65 72 76 65 72 2d  list. No server-
30170 6c 6f 63 6b 73 20 61 72 65 20 72 65 71 75 69 72  locks are requir
30180 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
30190 20 64 6f 20 74 68 69 73 20 61 73 20 77 65 20 68   do this as we h
301a0 61 76 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ave a write-lock
301b0 20 6f 6e 20 70 61 67 65 20 31 20 2d 20 67 75 61   on page 1 - gua
301c0 72 61 6e 74 65 65 69 6e 67 0a 20 20 20 20 20 20  ranteeing.      
301d0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
301e0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 62 20  ccess to the db 
301f0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  file.  */.      
30200 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 20 3d 20    MemPage *pT = 
30210 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  0;.        Pgno 
30220 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
30230 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b  e(&pNode->aData[
30240 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
30250 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30260 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
30270 72 75 6e 6b 2c 20 26 70 54 2c 20 30 29 3b 0a 20  runk, &pT, 0);. 
30280 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
302a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
302b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 2d  e3PagerWrite(pT-
302c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
302d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
302e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
302f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
30300 69 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  iPg = get4byte(&
30310 70 54 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  pT->aData[4]);. 
30320 20 20 20 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e           for(/*n
30330 6f 2d 6f 70 2a 2f 3b 20 69 50 67 3c 53 45 52 56  o-op*/; iPg<SERV
30340 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c  ER_DEFAULT_FREEL
30350 49 53 54 5f 53 49 5a 45 3b 20 69 50 67 2b 2b 29  IST_SIZE; iPg++)
30360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
30370 28 20 2b 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  ( ++pBt->nPage==
30380 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30390 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
303a0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  age++;.         
303b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 2d     put4byte(&pT-
303c0 3e 61 44 61 74 61 5b 38 2b 69 50 67 2a 34 5d 2c  >aData[8+iPg*4],
303d0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
303e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
303f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
30400 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 69 50 67 29  ->aData[4], iPg)
30410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30420 70 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  pTrunk==0 ){.   
30430 20 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20           pTrunk 
30440 3d 20 70 54 3b 0a 20 20 20 20 20 20 20 20 20 20  = pT;.          
30450 20 20 70 54 20 3d 20 30 3b 0a 20 20 20 20 20 20    pT = 0;.      
30460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30470 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30480 61 67 65 28 70 54 29 3b 0a 20 20 20 20 20 20 7d  age(pT);.      }
30490 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
304a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
304b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
304c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
304d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
304e0 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
304f0 2d 3e 6e 50 61 67 65 2c 20 26 70 4c 61 73 74 2c  ->nPage, &pLast,
30500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
30510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
30530 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30540 74 65 28 70 4c 61 73 74 2d 3e 70 44 62 50 61 67  te(pLast->pDbPag
30550 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
30560 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 29  leasePage(pLast)
30570 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
30580 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
30590 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
305a0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
305b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
305c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73   }.  }..  releas
305d0 65 50 61 67 65 28 70 4e 6f 64 65 29 3b 0a 20 20  ePage(pNode);.  
305e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
305f0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
30600 20 70 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 72   pTrunk );.    r
30610 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30620 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
30630 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  bPage);.  }.  if
30640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30650 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
30660 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  ge(pTrunk);.    
30670 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 7d 0a  pTrunk = 0;.  }.
30680 20 20 2a 70 70 54 72 75 6e 6b 20 3d 20 70 54 72    *ppTrunk = pTr
30690 75 6e 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  unk;.  return rc
306a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
306b0 61 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 50 61  allocateServerPa
306c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
306d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
306e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
306f0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
30700 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
30710 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
30720 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
30730 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
30740 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
30750 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
30760 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
30770 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
30780 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
30790 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
307a0 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
307b0 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
307c0 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
307d0 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
307e0 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
307f0 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ANY */.){.  int 
30800 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30820 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
30830 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
30840 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30850 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70 61 67 65  /* The node page
30860 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
30870 65 77 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  ew = 0;..#ifdef 
30880 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
30890 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
308a0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
308b0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e  Bt->pPager);.#en
308c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65  dif..  assert( e
308d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
308e0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
308f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30900 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
30910 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
30920 0a 20 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76  .  rc = findServ
30930 65 72 54 72 75 6e 6b 28 70 42 74 2c 20 31 2c 20  erTrunk(pBt, 1, 
30940 26 70 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  &pTrunk);.  if( 
30950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30960 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30980 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  Number of free p
30990 61 67 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75  ages on this tru
309a0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e  nk page */.    n
309b0 46 72 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34  Free = (int)get4
309c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
309d0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
309e0 20 6e 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20   nFree==0 ){.   
309f0 20 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74     pgnoNew = get
30a00 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30a10 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
30a20 61 73 73 65 72 74 28 20 70 67 6e 6f 4e 65 77 20  assert( pgnoNew 
30a30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
30a40 20 20 20 20 6e 46 72 65 65 2d 2d 3b 0a 20 20 20      nFree--;.   
30a50 20 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74     pgnoNew = get
30a60 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30a70 44 61 74 61 5b 38 2b 34 2a 6e 46 72 65 65 5d 29  Data[8+4*nFree])
30a80 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
30a90 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
30aa0 34 5d 2c 20 28 75 33 32 29 6e 46 72 65 65 29 3b  4], (u32)nFree);
30ab0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
30ac0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20  ge(pTrunk);.    
30ad0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
30ae0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
30af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30b00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
30b10 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
30b20 6c 61 67 73 20 3d 20 70 54 72 75 6e 6b 20 3f 20  lags = pTrunk ? 
30b30 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  0 : PAGER_GET_NO
30b40 43 4f 4e 54 45 4e 54 3b 0a 20 20 20 20 72 63 20  CONTENT;.    rc 
30b50 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
30b60 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4e 65  Page(pBt, pgnoNe
30b70 77 2c 20 26 70 4e 65 77 2c 20 66 6c 61 67 73 29  w, &pNew, flags)
30b80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
30b90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30bb0 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
30bc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
30bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30be0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
30bf0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
30c00 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
30c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30c20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30c30 5f 4f 4b 20 26 26 20 70 54 72 75 6e 6b 20 29 7b  _OK && pTrunk ){
30c40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
30c50 72 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 70 4e 65  runk->aData, pNe
30c60 77 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 75  w->aData, pBt->u
30c70 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
30c80 7d 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  }.    *ppPage = 
30c90 70 4e 65 77 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  pNew;.    *pPgno
30ca0 20 3d 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 7d 0a   = pgnoNew;.  }.
30cb0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
30cc0 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
30cd0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
30ce0 29 3d 3d 28 2a 70 70 50 61 67 65 21 3d 30 29 20  )==(*ppPage!=0) 
30cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30d00 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
30d10 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
30d20 28 6e 52 65 66 2b 28 2a 70 70 50 61 67 65 21 3d  (nRef+(*ppPage!=
30d30 30 29 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  0)) );.  return 
30d40 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
30d50 74 20 66 72 65 65 53 65 72 76 65 72 50 61 67 65  t freeServerPage
30d60 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
30d70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
30d80 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
30d90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30db0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30dc0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
30dd0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
30de0 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20      /* The node 
30df0 70 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  page */.#ifdef S
30e00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
30e10 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
30e20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
30e30 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  t->pPager);.#end
30e40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  if..  assert( sq
30e50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
30e60 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
30e70 20 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76 65    rc = findServe
30e80 72 54 72 75 6e 6b 28 70 42 74 2c 20 30 2c 20 26  rTrunk(pBt, 0, &
30e90 70 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  pTrunk);.  if( r
30ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30eb0 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30ed0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
30ee0 67 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e  ges on this trun
30ef0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e 46  k page */.    nF
30f00 72 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34 62  ree = (int)get4b
30f10 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30f20 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
30f30 6e 46 72 65 65 3e 3d 28 28 70 42 74 2d 3e 75 73  nFree>=((pBt->us
30f40 61 62 6c 65 53 69 7a 65 20 2f 20 34 29 20 2d 20  ableSize / 4) - 
30f50 32 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  2) ){.      if( 
30f60 70 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pPage==0 ){.    
30f70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30f80 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30f90 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
30fa0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
30fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30fc0 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
30fd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30fe0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
30ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31000 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31010 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31030 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
31040 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e  >aData, pTrunk->
31050 61 44 61 74 61 2c 20 70 42 74 2d 3e 75 73 61 62  aData, pBt->usab
31060 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  leSize);.       
31070 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
31080 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 50 61  k->aData[0], iPa
31090 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
310a0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
310b0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
310c0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
310d0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
310e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
310f0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
31100 2d 3e 61 44 61 74 61 5b 38 2b 6e 46 72 65 65 2a  ->aData[8+nFree*
31110 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
31120 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
31130 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 28 75  nk->aData[4], (u
31140 33 32 29 6e 46 72 65 65 2b 31 29 3b 0a 20 20 20  32)nFree+1);.   
31150 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
31160 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
31170 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
31180 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
31190 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
311a0 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
311b0 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
311c0 66 69 6e 65 20 61 6c 6c 6f 63 61 74 65 53 65 72  fine allocateSer
311d0 76 65 72 50 61 67 65 28 76 2c 20 77 2c 20 78 2c  verPage(v, w, x,
311e0 20 79 2c 20 7a 29 20 53 51 4c 49 54 45 5f 4f 4b   y, z) SQLITE_OK
311f0 0a 23 20 64 65 66 69 6e 65 20 66 72 65 65 53 65  .# define freeSe
31200 72 76 65 72 50 61 67 65 32 28 78 2c 20 79 2c 20  rverPage2(x, y, 
31210 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
31220 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 45  dif /* SQLITE_SE
31230 52 56 45 52 5f 45 44 49 54 49 4f 4e 20 2a 2f 0a  RVER_EDITION */.
31240 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
31250 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
31260 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31270 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
31280 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
31290 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
312a0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
312b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
312c0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
312d0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
312e0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
312f0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
31300 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
31310 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
31320 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
31330 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31340 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
31350 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
31360 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
31370 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
31380 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
31390 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
313a0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
313b0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
313c0 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
313d0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
313e0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
313f0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
31400 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
31410 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
31420 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31430 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
31440 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
31450 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
31460 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
31470 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
31480 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
31490 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
314a0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
314b0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
314c0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
314d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
314e0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
314f0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
31500 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
31510 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
31520 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
31530 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
31540 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
31550 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
31560 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
31570 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
31580 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
31590 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
315a0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
315b0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
315c0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
315d0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
315e0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
315f0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
31600 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
31610 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
31620 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
31630 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
31640 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
31650 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
31660 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
31680 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
31690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
316a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
316b0 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
316c0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
316d0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
316e0 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
316f0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
31700 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
31710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
31720 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
31730 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
31740 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
31750 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
31760 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
31770 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
31780 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
31790 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
317a0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
317b0 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
317c0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
317d0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
317e0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
317f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
31800 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31810 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
31820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31830 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
31840 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
31850 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
31860 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
31870 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
31880 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
31890 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
318a0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
318b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
318c0 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  /..  if( sqlite3
318d0 50 61 67 65 72 49 73 53 65 72 76 65 72 28 70 42  PagerIsServer(pB
318e0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
318f0 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74    return allocat
31900 65 53 65 72 76 65 72 50 61 67 65 28 70 42 74 2c  eServerPage(pBt,
31910 20 70 70 50 61 67 65 2c 20 70 50 67 6e 6f 2c 20   ppPage, pPgno, 
31920 6e 65 61 72 62 79 2c 20 65 4d 6f 64 65 29 3b 20  nearby, eMode); 
31930 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
31940 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31950 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31960 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
31970 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
31980 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
31990 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
319a0 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
319b0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
319c0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
319d0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
319e0 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
319f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
31a00 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
31a10 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
31a20 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
31a30 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
31a40 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
31a50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31a60 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31a70 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
31a80 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31a90 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
31aa0 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
31ab0 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
31ac0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
31ad0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31ae0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
31af0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
31b00 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
31b10 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
31b20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
31b30 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
31b40 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
31b50 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
31b60 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
31b70 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
31b80 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
31b90 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
31ba0 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
31bb0 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
31bc0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
31bd0 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
31be0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
31bf0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31c00 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
31c10 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31c20 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
31c30 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
31c40 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
31c50 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
31c60 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
31c70 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
31c80 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
31c90 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
31ca0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
31cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31cc0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
31cd0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
31ce0 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
31cf0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
31d00 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
31d10 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
31d20 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
31d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31d40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31d50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31d60 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
31d70 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
31d80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31d90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31da0 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
31db0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
31dc0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
31dd0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
31de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31df0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
31e00 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
31e10 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
31e20 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
31e30 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
31e40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
31e50 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
31e60 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
31e70 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
31e80 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
31e90 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
31ea0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
31eb0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
31ec0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31ed0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31ee0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
31ef0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
31f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31f10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31f20 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
31f30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
31f40 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
31f50 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
31f60 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
31f70 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
31f80 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
31f90 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
31fa0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
31fb0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
31fc0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
31fd0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
31fe0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
31ff0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
32000 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
32010 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
32020 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
32030 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
32040 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
32050 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
32060 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
32070 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
32080 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
32090 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
320a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
320b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
320c0 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
320d0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
320e0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
320f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
32100 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32110 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
32120 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
32130 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
32140 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
32150 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
32160 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
32170 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
32180 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
32190 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
321a0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
321b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
321c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
321d0 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
321e0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
321f0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
32200 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
32210 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
32220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
32230 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
32240 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
32250 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
32260 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
32270 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
32280 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
32290 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
322a0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
322b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
322c0 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
322d0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
322e0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
322f0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
32300 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
32310 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32320 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
32330 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
32340 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32350 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32360 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
32370 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32380 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
32390 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
323a0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
323b0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
323c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
323d0 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
323e0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
323f0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
32400 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
32410 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
32420 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
32430 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
32440 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
32450 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
32460 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
32470 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
32480 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
32490 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
324a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
324b0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
324c0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
324d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
324e0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
324f0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
32500 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
32510 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
32520 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
32530 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
32540 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
32550 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
32560 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
32570 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
32580 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
32590 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
325a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
325b0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
325c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
325d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
325e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
325f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32610 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
32620 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
32630 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
32640 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
32650 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32660 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32670 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32680 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32690 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
326a0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
326b0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
326c0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
326d0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
326e0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
326f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
32700 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
32710 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
32720 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
32730 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
32740 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
32750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32760 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
32770 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32780 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
32790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
327a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
327b0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
327c0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
327d0 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
327e0 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
327f0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
32800 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
32810 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
32820 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
32830 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
32840 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
32850 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
32860 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
32870 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
32880 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
32890 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
328a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
328b0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
328c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
328d0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
328e0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
328f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32910 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32940 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32950 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32960 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
32970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
32980 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
32990 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
329a0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
329b0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
329c0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
329d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
329e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
329f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32a00 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
32a10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32a20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32a40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32a50 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32a70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32a80 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
32a90 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
32aa0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ad0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
32ae0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
32af0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
32b00 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
32b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
32b20 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
32b30 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
32b40 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
32b50 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
32b60 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
32b70 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
32b80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32b90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
32ba0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
32bb0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
32bc0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
32bd0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
32be0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
32bf0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
32c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32c10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32c20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32c30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32c40 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32c60 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
32c70 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
32c80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
32c90 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
32ca0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
32cb0 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
32cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
32cf0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32d00 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
32d10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32d20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32d30 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
32d40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32d70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
32d80 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32d90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32da0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32dc0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
32dd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32de0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
32df0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
32e00 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
32e10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
32e20 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
32e30 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
32e40 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
32e50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
32e60 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
32e70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32e80 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
32e90 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
32ea0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
32eb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
32ec0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32ed0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
32ee0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
32ef0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32f00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32f10 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
32f20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32f40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32f50 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
32f60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
32f90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32fa0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32fb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
32fc0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
32fd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32fe0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
32ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33000 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
33010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
33020 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
33030 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
33040 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
33050 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
33060 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
33070 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
33080 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
33090 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
330a0 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
330b0 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
330c0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
330d0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
330e0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
330f0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
33100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
33110 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
33120 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
33130 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
33140 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33150 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
33160 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
33170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
33180 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33190 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
331a0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
331b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
331c0 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
331d0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
331e0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
331f0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
33200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
33210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33240 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
33250 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33260 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
33270 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
33280 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
33290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
332a0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
332b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
332c0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
332d0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
332e0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
332f0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
33300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
33310 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
33320 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
33330 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
33340 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
33350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33360 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33390 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
333a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
333b0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
333c0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
333d0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
333e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
333f0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
33400 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
33410 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
33420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33430 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33440 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33450 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33470 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
33480 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
33490 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
334a0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
334b0 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
334c0 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
334d0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
334e0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
334f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
33500 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
33510 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
33520 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
33530 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
33540 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
33550 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
33560 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
33570 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
33580 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
33590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
335a0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
335b0 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
335c0 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
335d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
335e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
335f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
33600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33610 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
33620 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33630 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
33640 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
33650 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
33660 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
33670 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
33680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33690 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
336a0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
336b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
336c0 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
336d0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
336e0 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
336f0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
33700 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
33710 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
33720 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
33730 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
33740 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
33750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33780 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
33790 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
337a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
337b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
337d0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
337e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
337f0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
33800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33820 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
33830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33840 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
33850 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
33860 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
33870 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
33880 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
33890 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
338a0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
338b0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
338c0 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
338d0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
338e0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
338f0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
33900 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
33910 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
33920 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
33930 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
33940 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
33950 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
33960 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
33970 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
33980 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
33990 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
339a0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
339b0 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
339c0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
339d0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
339e0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
339f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
33a00 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
33a10 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
33a20 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
33a30 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
33a40 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
33a50 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
33a60 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
33a70 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
33a80 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
33a90 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
33aa0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
33ab0 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
33ac0 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
33ad0 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
33ae0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
33af0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
33b00 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
33b10 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
33b20 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
33b30 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
33b40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
33b50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
33b60 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
33b70 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
33b80 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
33b90 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
33ba0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
33bb0 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
33bc0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
33bd0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
33be0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
33bf0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
33c00 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
33c10 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
33c20 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
33c30 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
33c40 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
33c50 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
33c60 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
33c70 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33c80 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
33c90 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33ca0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
33cb0 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
33cc0 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
33cd0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
33ce0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
33cf0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
33d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33d10 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
33d20 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
33d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
33d50 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
33d60 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
33d70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
33d80 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
33d90 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
33da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33db0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33dc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33dd0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
33de0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33df0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33e00 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
33e10 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
33e20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
33e30 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
33e40 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
33e50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
33e60 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
33e70 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
33e80 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
33e90 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
33ea0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
33eb0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
33ec0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
33ed0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33ee0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
33ef0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
33f00 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
33f10 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
33f20 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
33f30 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
33f40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33f50 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
33f60 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33f70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
33f80 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33f90 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
33fa0 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
33fb0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
33fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33ff0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
34000 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
34010 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
34020 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
34030 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34040 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
34050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
34060 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
34070 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
34080 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
34090 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
340a0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
340b0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
340c0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
340d0 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
340e0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
340f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
34100 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
34110 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
34120 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
34130 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
34140 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
34150 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
34160 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34170 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
34180 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34190 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
341a0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
341b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
341c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
341d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
341e0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
341f0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
34200 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
34210 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
34220 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
34230 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
34240 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
34250 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
34260 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
34270 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34280 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
34290 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
342a0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
342b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
342c0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
342d0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
342e0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
342f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34300 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
34310 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
34320 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34330 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34340 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
34350 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
34360 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34370 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
34380 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
34390 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
343a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
343b0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
343c0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
343d0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
343e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
343f0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
34400 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
34410 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
34420 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
34430 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
34440 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
34450 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
34460 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
34470 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
34480 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
34490 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
344a0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
344b0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
344c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
344d0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
344e0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
344f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
34500 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
34510 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
34520 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
34530 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
34540 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
34550 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
34560 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
34570 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
34580 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
34590 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345b0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
345c0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
345d0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
34600 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
34610 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
34620 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
34630 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
34640 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
34650 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
34660 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
34670 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
34680 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34690 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
346a0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
346b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
346e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
346f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
34710 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
34720 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
34730 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
34740 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34750 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
34760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
34770 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
34780 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
34790 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
347a0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
347b0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
347c0 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
347d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
347e0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
347f0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
34800 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
34810 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
34820 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
34830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
34840 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
34850 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
34860 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  ;.  }..  if( pBt
34870 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
34880 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
34890 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
348a0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
348b0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
348c0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
348d0 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
348e0 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
348f0 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
34900 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
34910 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
34920 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
34930 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
34940 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
34950 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
34960 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
34970 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
34980 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
34990 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
349a0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
349b0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
349c0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
349d0 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
349e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
349f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
34a00 67 65 72 49 73 53 65 72 76 65 72 28 70 42 74 2d  gerIsServer(pBt-
34a10 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
34a20 72 63 20 3d 20 66 72 65 65 53 65 72 76 65 72 50  rc = freeServerP
34a30 61 67 65 32 28 70 42 74 2c 20 70 50 61 67 65 2c  age2(pBt, pPage,
34a40 20 69 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74   iPage);.    got
34a50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34a60 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
34a70 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
34a80 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
34a90 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
34aa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34ab0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
34ac0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34ad0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34ae0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
34af0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34b00 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
34b10 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34b20 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
34b30 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
34b40 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34b50 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
34b60 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
34b70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
34b80 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
34b90 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
34ba0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
34bb0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
34bc0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34bd0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
34be0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
34bf0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
34c00 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34c10 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
34c20 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
34c30 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
34c40 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
34c50 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
34c60 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
34c70 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
34c80 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
34c90 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
34ca0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
34cb0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
34cc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
34cd0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
34ce0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
34cf0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
34d00 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34d10 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
34d20 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
34d30 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
34d40 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34d50 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
34d60 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
34d70 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
34d80 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
34d90 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
34da0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
34db0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
34dc0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
34dd0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
34de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34df0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
34e00 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
34e10 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
34e20 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
34e30 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
34e40 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
34e50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
34e60 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
34e70 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
34e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
34ea0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34eb0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
34ec0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
34ed0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
34ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
34ef0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
34f00 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
34f10 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
34f20 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
34f30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34f40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34f50 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34f60 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34f70 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
34f80 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
34f90 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
34fa0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
34fb0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
34fc0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
34fd0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
34fe0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
34ff0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
35000 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
35010 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
35020 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
35030 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
35040 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
35050 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
35060 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
35070 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
35080 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
35090 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
350a0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
350b0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
350c0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
350d0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
350e0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
350f0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
35100 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
35110 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
35120 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
35130 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
35140 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
35150 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
35160 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
35170 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
35180 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
35190 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
351a0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
351b0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
351c0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
351d0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
351e0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
351f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
35200 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
35210 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
35220 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
35230 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
35240 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
35250 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
35260 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
35270 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
35280 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
35290 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
352a0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
352b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
352c0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
352d0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
352e0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
352f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
35300 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
35310 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
35320 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
35330 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
35340 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
35350 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
35360 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
35370 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
35380 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
35390 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
353a0 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
353b0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
353c0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
353d0 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
353e0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
353f0 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
35400 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
35410 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
35420 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35430 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
35440 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
35450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35460 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
35470 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
35480 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
35490 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
354a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
354b0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
354c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
354d0 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
354e0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
354f0 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
35500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35510 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
35520 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
35530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35540 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
35550 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
35560 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
35570 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
35580 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
35590 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
355a0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
355b0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
355c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
355d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
355e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
355f0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
35600 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
35610 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
35620 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
35630 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
35640 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
35650 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
35660 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
35670 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
35680 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
35690 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
356a0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
356b0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
356c0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
356d0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
356e0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
356f0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
35700 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
35710 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
35720 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
35730 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
35740 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
35750 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
35760 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
35770 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
35780 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
35790 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
357a0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
357b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
357c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
357d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
357e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
357f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
35800 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
35810 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
35820 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
35830 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
35840 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
35850 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
35860 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
35870 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
35880 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
35890 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
358a0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
358b0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
358c0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
358d0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
358e0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
358f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
35900 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
35910 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
35920 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
35930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35940 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
35950 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
35960 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
35970 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
35980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
35990 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
359a0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
359b0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
359c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
359d0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
359e0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
359f0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
35a00 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
35a10 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
35a20 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
35a30 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
35a40 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
35a50 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
35a60 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
35a70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
35a80 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
35a90 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
35aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35ab0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
35ac0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
35ad0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35ae0 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
35af0 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
35b00 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  l */.  CellInfo 
35b10 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  *pInfo          
35b20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74  /* Size informat
35b30 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
35b40 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ll */.){.  BtSha
35b50 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
35b60 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76  ->pBt;.  Pgno ov
35b70 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
35b80 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
35b90 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
35ba0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
35bb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35bc0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35bd0 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
35be0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
35bf0 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
35c00 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
35c10 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
35c20 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
35c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
35c40 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
35c50 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
35c60 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
35c70 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
35c80 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53   pCell+pInfo->nS
35c90 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
35ca0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
35cb0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
35cc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35cd0 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
35ce0 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
35cf0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
35d00 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
35d10 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
35d20 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
35d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
35d40 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
35d50 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
35d60 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35d70 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
35d80 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
35d90 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
35da0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
35db0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
35dc0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
35dd0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
35de0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
35df0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
35e00 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
35e10 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35e20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35e30 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35e40 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35e50 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35e60 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35e70 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
35e80 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
35e90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
35ea0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
35eb0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
35ec0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
35ed0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
35ee0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
35ef0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
35f00 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
35f10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35f20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35f30 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35f40 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35f50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35f60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35f70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
35f80 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
35f90 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
35fa0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
35fb0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
35fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
35fd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35fe0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
35ff0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
36000 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
36010 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
36020 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
36030 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
36040 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
36050 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
36060 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
36070 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
36080 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
36090 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
360a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
360b0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
360c0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
360d0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
360e0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
360f0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
36100 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
36110 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
36120 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
36130 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
36140 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
36150 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
36160 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
36170 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
36180 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
36190 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
361a0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
361b0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
361c0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
361d0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
361e0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
361f0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
36200 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
36210 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
36220 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
36230 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
36240 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
36250 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
36260 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
36270 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
36280 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
36290 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
362a0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
362b0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
362c0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
362d0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
362e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
362f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
36310 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
36320 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
36330 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
36340 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
36350 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36360 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
36370 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
36380 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36390 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
363a0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
363b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
363c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
363d0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
363e0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
363f0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
36400 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
36410 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
36420 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
36430 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
36440 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
36450 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
36460 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
36470 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
36480 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
36490 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
364a0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
364b0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
364c0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
364d0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
364e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
364f0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
36500 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
36510 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
36520 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
36530 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
36540 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
36550 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
36560 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
36570 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
36580 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
36590 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
365a0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
365b0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
365c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
365d0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
365e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
365f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36600 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
36610 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
36620 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
36630 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
36640 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
36650 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
36660 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
36670 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
36680 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
36690 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
366a0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
366b0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
366c0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
366d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
366e0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
366f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
36700 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
36710 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
36720 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
36730 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
36740 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
36750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
36760 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
36770 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
36780 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
36790 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
367a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
367b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
367c0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
367d0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
367e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
367f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36800 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
36810 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
36820 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
36830 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
36840 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
36850 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
36860 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
36870 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
36880 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
36890 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
368a0 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
368b0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
368c0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
368d0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
368e0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
368f0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36900 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36910 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
36920 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
36930 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
36940 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
36950 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
36960 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36970 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
36980 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
36990 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
369a0 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
369b0 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
369c0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
369d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
369e0 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
369f0 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
36a00 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
36a10 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
36a20 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
36a30 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
36a40 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
36a50 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
36a60 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36a70 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
36a80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36a90 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
36aa0 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
36ab0 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
36ac0 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
36ad0 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
36ae0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
36af0 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
36b00 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
36b10 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
36b20 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
36b30 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
36b40 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
36b50 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  */.  if( nPayloa
36b60 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
36b70 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
36b80 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
36b90 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36ba0 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
36bb0 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
36bc0 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
36bd0 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
36be0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
36bf0 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
36c00 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
36c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
36c20 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
36c30 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
36c40 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
36c50 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
36c60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36c70 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
36c80 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
36c90 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
36ca0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
36cb0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
36cc0 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
36cd0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
36ce0 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
36cf0 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
36d00 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
36d10 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
36d20 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
36d30 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
36d40 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
36d50 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
36d60 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
36d70 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
36d80 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
36d90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
36da0 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
36db0 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
36dc0 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
36dd0 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
36de0 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
36df0 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
36e00 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
36e10 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
36e20 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
36e30 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
36e40 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
36e50 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
36e60 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
36e70 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
36e80 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
36e90 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
36ea0 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
36eb0 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
36ec0 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
36ed0 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
36ee0 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
36ef0 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
36f00 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
36f10 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
36f20 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
36f30 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
36f40 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
36f50 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
36f60 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
36f70 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
36f80 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
36f90 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
36fa0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ly..  */.#ifdef 
36fb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
36fc0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
36fd0 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
36fe0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
36ff0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
37000 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
37010 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
37020 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
37030 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
37040 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
37050 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
37060 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
37070 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
37080 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
37090 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
370a0 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
370b0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
370c0 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
370d0 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
370e0 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
370f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
37100 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
37110 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
37120 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
37130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37140 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
37150 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
37160 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
37170 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
37180 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
37190 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
371a0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
371b0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
371c0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
371d0 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
371e0 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
371f0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
37200 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
37210 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
37220 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37230 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
37240 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
37250 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
37260 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
37270 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
37280 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
37290 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
372a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
372b0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
372c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
372d0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
372e0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
372f0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
37300 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
37310 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
37320 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
37330 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
37340 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
37350 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
37360 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
37370 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
37380 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
37390 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
373a0 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
373b0 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
373c0 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
373d0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
373e0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
373f0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
37400 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
37410 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
37420 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
37430 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
37440 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
37450 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
37460 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
37470 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
37480 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
37490 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
374a0 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
374b0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
374c0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
374d0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
374e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
374f0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
37500 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
37510 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
37520 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
37530 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
37540 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
37550 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
37560 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
37570 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37580 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37590 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
375a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
375b0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
375c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
375d0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
375e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
375f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
37600 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
37610 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
37620 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
37630 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
37640 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
37650 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
37660 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
37670 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
37680 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
37690 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
376a0 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
376b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
376c0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
376d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
376e0 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
376f0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
37700 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
37710 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
37720 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
37730 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
37740 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
37750 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
37760 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
37770 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
37780 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
37790 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
377a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
377b0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
377c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
377d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
377e0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
377f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37800 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37810 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
37820 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
37830 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
37840 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
37850 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
37860 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
37870 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
37880 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
37890 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
378a0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
378b0 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
378c0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
378d0 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
378e0 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
378f0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
37900 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
37910 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
37920 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
37930 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
37940 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
37950 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
37960 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
37970 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37980 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
37990 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
379a0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
379b0 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
379c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
379d0 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
379e0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
379f0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
37a00 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
37a10 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
37a20 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
37a30 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
37a40 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
37a50 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
37a60 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
37a70 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
37a80 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
37a90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37aa0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37ab0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
37ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
37ad0 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
37ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
37af0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
37b00 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
37b10 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
37b20 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
37b30 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
37b40 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
37b50 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
37b60 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
37b70 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
37b80 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
37b90 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
37ba0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
37bb0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
37bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
37be0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
37bf0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
37c00 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
37c10 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
37c20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
37c30 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
37c40 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
37c50 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
37c60 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
37c70 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
37c80 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
37c90 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
37ca0 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
37cb0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
37cc0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
37cd0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
37ce0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
37cf0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
37d00 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
37d10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
37d20 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
37d30 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
37d40 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
37d50 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
37d60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
37d70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
37d80 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37d90 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
37da0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
37db0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
37dc0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
37dd0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
37de0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
37df0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
37e00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
37e10 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
37e20 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
37e30 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
37e40 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
37e50 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
37e60 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
37e70 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
37e80 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
37e90 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
37ea0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
37eb0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37ec0 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
37ed0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
37ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37ef0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37f00 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37f10 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37f30 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
37f40 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
37f50 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
37f60 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
37f70 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
37f80 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
37f90 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
37fa0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37fb0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37fc0 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
37fd0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
37fe0 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
37ff0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38000 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
38010 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
38020 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
38030 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
38040 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
38050 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
38060 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38070 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
38080 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
38090 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
380a0 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
380b0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
380c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
380d0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
380e0 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
380f0 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
38100 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
38110 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
38120 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
38130 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
38140 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
38150 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
38160 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
38170 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
38180 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
38190 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
381a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
381b0 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
381c0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
381d0 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
381e0 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
381f0 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
38200 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
38210 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
38220 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
38230 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
38240 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
38250 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
38260 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
38270 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
38280 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
38290 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
382a0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
382b0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
382c0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
382d0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
382e0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
382f0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
38300 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
38310 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
38320 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
38330 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
38340 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
38350 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
38360 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
38370 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
38380 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
38390 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
383a0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
383b0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
383c0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
383d0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
383e0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
383f0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
38400 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
38410 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
38420 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
38430 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
38440 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
38450 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
38460 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52  ented..**.** *pR
38470 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45  C mu