/ Hex Artifact Content
Login

Artifact 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4:


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 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7170: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
7180: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
7190: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
71a0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
71b0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
71c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
71d0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
71e0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
71f0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
7200: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
7210: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
7220: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
7230: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
7240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
7250: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
7260: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
7270: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
7280: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
7290: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
72a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
72b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
72c0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
72d0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
72e0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
72f0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
7300: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
7310: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
7320: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
7330: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
7340: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
7350: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
7360: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
7370: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
7380: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7390: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
73a0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
73b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
73d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
73e0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
73f0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
7400: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
7410: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
7420: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
7430: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7440: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
7450: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7460: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
7470: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7480: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
7490: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
74a0: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
74b0: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
74c0: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
74d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
74e0: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
74f0: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
7500: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
7510: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
7520: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
7530: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
7540: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
7550: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
7560: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
7570: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
7580: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
7590: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
75a0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
75b0: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
75c0: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
75d0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
75e0: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
75f0: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7600: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
7610: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
7620: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
7630: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
7640: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
7650: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
7660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7670: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7680: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7690: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
76a0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
76b0: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
76c0: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
76d0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
76e0: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
76f0: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
7700: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
7710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
7720: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
7730: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
7740: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
7750: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
7760: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7770: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
7780: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
7790: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
77a0: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
77b0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
77c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
77d0: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
77e0: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
77f0: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
7800: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
7810: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
7820: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
7830: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
7840: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
7850: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
7860: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
7870: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
7880: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
7890: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
78a0: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
78b0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
78c0: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
78d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
78e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
78f0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
7900: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7910: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7920: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7930: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7940: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7950: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7960: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7970: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7980: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7990: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
79a0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
79b0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
79c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
79d0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
79e0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
79f0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
7a00: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
7a10: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7a20: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7a30: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7a40: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7a50: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7a60: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7a70: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7a80: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7a90: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7ab0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7ac0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
7ad0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
7ae0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
7af0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7b00: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
7b10: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7b20: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7b30: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7b40: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7b50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7b60: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7b80: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7b90: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7ba0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7bb0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
7bc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
7bd0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7be0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
7bf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
7c00: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7c10: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7c20: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7c30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
7c40: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7c60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7c70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7c80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7c90: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7ca0: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7cb0: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7cc0: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7cd0: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7ce0: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7cf0: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7d00: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7d10: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7d20: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
7d30: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
7d40: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
7d50: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
7d60: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7d80: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7d90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7da0: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7db0: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7dc0: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7dd0: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7de0: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7df0: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7e00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7e10: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7e20: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
7e30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
7e40: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
7e50: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
7e60: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7e70: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7e80: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7e90: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7ea0: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7eb0: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7ef0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7f00: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7f10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7f20: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
7f30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7f40: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
7f50: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
7f60: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7f70: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7f80: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7f90: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7fa0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7fb0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7fc0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7fd0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7fe0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7ff0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
8000: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
8010: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
8020: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
8030: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
8040: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8050: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
8060: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8070: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8080: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
80a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
80b0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
80c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
80d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
80e0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
80f0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
8100: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
8110: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
8120: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
8130: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
8140: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
8150: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
8160: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8170: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8180: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8190: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
81a0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
81b0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
81c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
81d0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
81e0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
81f0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
8200: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
8210: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
8220: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
8230: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
8240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
8250: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
8260: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8270: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8280: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8290: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
82b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
82c0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
82d0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
82e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
82f0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
8300: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8310: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
8320: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
8330: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
8340: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
8350: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8360: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8370: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8380: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8390: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
83a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
83b0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
83c0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
83d0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
83e0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
83f0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8400: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8410: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8420: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
8430: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
8440: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
8450: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8460: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8470: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8480: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8490: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
84a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
84b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
84c0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
84d0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
84e0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
84f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
8500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
8510: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
8520: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
8530: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
8540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8550: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8560: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8570: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8580: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
85a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
85b0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
85c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
85d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
85e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
85f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28 63  n;.  }.  if( ((c
8600: 68 61 72 2a 29 73 71 6c 69 74 65 33 50 61 67 65  har*)sqlite3Page
8610: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
8620: 65 29 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  e))[0]!=0 ){.   
8630: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 62 79   /* The first by
8640: 74 65 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  te of the extra 
8650: 64 61 74 61 20 69 73 20 74 68 65 20 4d 65 6d 50  data is the MemP
8660: 61 67 65 2e 69 73 49 6e 69 74 20 62 79 74 65 2e  age.isInit byte.
8670: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 61 74 20  .    ** If that 
8680: 62 79 74 65 20 69 73 20 73 65 74 2c 20 69 74 20  byte is set, it 
8690: 6d 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20  means this page 
86a0: 69 73 20 61 6c 73 6f 20 62 65 69 6e 67 20 75 73  is also being us
86b0: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 62  ed.    ** as a b
86c0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
86d0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
86e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
86f0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8700: 69 74 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  it;.  }.  offset
8710: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
8720: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
8730: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
8740: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8750: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8760: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
8770: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
8780: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8790: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
87a0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
87b0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
87c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
87d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
87e0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
87f0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
8800: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8810: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
8820: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
8830: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8840: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8850: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8860: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
8870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8880: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8890: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
88a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
88b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
88c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
88d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
88e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
88f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
8900: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
8910: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8920: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
8930: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
8940: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
8950: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8960: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8970: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8980: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8990: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
89a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
89b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
89c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
89d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
89e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
89f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8a00: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8a10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8a20: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8a30: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8a40: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8a50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8a60: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8a70: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8a80: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8a90: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8aa0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8ab0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ad0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8ae0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8af0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8b00: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8b10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8b20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8b30: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8b40: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8b50: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8b60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8b70: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8b80: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8b90: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8ba0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8bb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8bc0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8bd0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8be0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8bf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8c10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8c20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8c30: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8c40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8c50: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8c60: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8c70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8c80: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8c90: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8ca0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8cb0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8cc0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8cd0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8ce0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8cf0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8d00: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8d10: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8d20: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8d30: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8d40: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8d50: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8d60: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8d70: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8d80: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61  RUPT_PGNO(iPtrma
8db0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
8dc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8dd0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8de0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8df0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8e00: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8e10: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8e20: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8e30: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8e40: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8e50: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
8e60: 20 7a 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   z, rc).#endif..
8e70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8e80: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8e90: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8ea0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8eb0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8ec0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8ed0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8ee0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8ef0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8f00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8f10: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8f20: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8f30: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8f40: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8f50: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8f60: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8f70: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8f80: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8f90: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8fb0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8fc0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8fd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8fe0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8ff0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9000: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
9010: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
9020: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9030: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9040: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
9050: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
9060: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
9070: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
9080: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9090: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
90a0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
90b0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
90c0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
90d0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
90e0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
90f0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
9120: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
9130: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
9140: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
9150: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
9160: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
9170: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
9180: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
9190: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
91a0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
91b0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
91c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91e0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
91f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9200: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9210: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9220: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9230: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9240: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9250: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9260: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9270: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9280: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9290: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
92a0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
92b0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
92c0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
92d0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
92e0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
92f0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9300: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9310: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9320: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9330: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9340: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9350: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9360: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
9370: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
9380: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
9390: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
93a0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
93b0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
93c0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
93d0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
93e0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
93f0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9400: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9410: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9420: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9430: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9440: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9450: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9460: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
9470: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
9480: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
9490: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
94a0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
94b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
94c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
94d0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
94e0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
94f0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9500: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9510: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9530: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9550: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9560: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9570: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9580: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9590: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
95a0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
95b0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
95c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
95e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
95f0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9600: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9610: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9620: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9630: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9640: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9650: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9660: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
9670: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
9680: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
9690: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
96a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
96b0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
96c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
96d0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
96e0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
96f0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9700: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9710: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9720: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9730: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9740: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9750: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9760: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
9770: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
9780: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
9790: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
97a0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
97b0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97c0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
97d0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
97e0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
97f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9800: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9810: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9820: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9830: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9840: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9850: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9860: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
9870: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
9880: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
9890: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
98a0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
98b0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
98c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
98d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
98e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
98f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9900: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9910: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9920: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9930: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9940: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9950: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9960: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9970: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9980: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
99a0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
99b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
99c0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
99d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
99e0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
99f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9a00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9a10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9a20: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9a30: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9a40: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9a50: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9a60: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9a70: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9a80: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9a90: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9aa0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9ab0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9ac0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9ad0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9ae0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9af0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9b10: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9b20: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9b30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9b40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9b50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9b60: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b80: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9b90: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9ba0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9bc0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9bd0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9be0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9c00: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9c10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9c20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9c30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9c40: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9c50: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9c60: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9c70: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9c80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9c90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ca0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9cb0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9cc0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9cd0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9ce0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9cf0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9d00: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9d10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9d20: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9d30: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9d40: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9d50: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9d60: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9d70: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9d80: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9d90: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9da0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9db0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9dc0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9dd0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9de0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9df0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9e00: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9e10: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9e20: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9e30: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9e40: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9e50: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9e60: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9e70: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9e80: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9e90: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9ea0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9eb0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9ec0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9ed0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9ef0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9f00: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9f10: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9f20: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9f30: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9f40: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9f50: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9f60: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9f80: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9f90: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9fa0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9fb0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9fc0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9fd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ff0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
a000: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
a010: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
a020: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
a030: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
a040: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
a050: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
a060: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
a070: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a080: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a090: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a0a0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a0b0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
a0c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a0d0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
a0e0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
a0f0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
a100: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
a110: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
a120: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
a130: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
a140: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
a150: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
a160: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
a170: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a180: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
a190: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
a1a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
a1b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a1c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a1e0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a1f0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a200: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a210: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a220: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a230: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
a240: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a270: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a280: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a290: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a2a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a2b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a2c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a2d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a2e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a2f0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a300: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a310: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a320: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a3a0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a3b0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a3c0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a3d0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a3e0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a3f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a400: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a410: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a420: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a430: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a440: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a450: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a460: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a480: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a490: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a4a0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a4b0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a4c0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a4d0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a4e0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a4f0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a500: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a510: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a520: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a530: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a540: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a550: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a580: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a590: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a5a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a5b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a5c0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a5d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a5e0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a5f0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a600: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a610: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a620: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a630: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a640: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a650: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a660: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a670: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a680: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a690: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a6a0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a6c0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a6d0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a6e0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a6f0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a700: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a710: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a720: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a730: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a740: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a750: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a770: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a780: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a790: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a7a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a7b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a7c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a7d0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a7e0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a7f0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a800: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a820: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a830: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a840: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a850: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a860: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a870: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a880: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a890: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a8a0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a8b0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a8c0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a8d0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a8e0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a8f0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a900: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a910: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a920: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a930: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a940: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a950: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a960: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a970: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a980: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a990: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a9b0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a9c0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a9d0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a9e0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a9f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
aa00: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
aa10: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
aa20: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa30: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
aa40: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
aa50: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
aa60: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
aa90: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
aaa0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aad0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
aae0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
aaf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
ab00: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ab10: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
ab20: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
ab30: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
ab40: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
ab50: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
ab60: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
ab70: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
ab80: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
ab90: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
aba0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
abb0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
abc0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
abd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
abe0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
abf0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
ac00: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
ac10: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
ac20: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
ac30: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac40: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
ac50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
ac60: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
ac70: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
ac80: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
ac90: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
aca0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
acb0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
acc0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
acd0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
ace0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
acf0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
ad00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ad10: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
ad20: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
ad30: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
ad40: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
ad50: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
ad60: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
ad70: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
ad80: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
ad90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
ada0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
adb0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
adc0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
add0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ade0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
adf0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ae00: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ae10: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ae20: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ae30: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ae40: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ae60: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
ae70: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
ae80: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
ae90: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
aea0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
aeb0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
aec0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
aed0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
aee0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
aef0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
af00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
af10: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
af20: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
af30: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
af40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
af50: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
af60: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af70: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af80: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
af90: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
afa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
afb0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
afc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
afd0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
afe0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
aff0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
b000: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b010: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
b020: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
b030: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
b040: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
b050: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
b060: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
b070: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
b080: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
b090: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
b0a0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
b0b0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
b0c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
b0d0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
b0e0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
b100: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
b110: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b120: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b130: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b140: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b150: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b160: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b170: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b180: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b190: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b1a0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b1b0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b1c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b1d0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b1e0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b1f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b200: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b210: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b220: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b230: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b240: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b250: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b260: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b270: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
b280: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
b290: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b2a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b2b0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b2c0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b2d0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b2e0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b2f0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b300: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b310: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b320: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b330: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b340: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b350: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b360: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b380: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b390: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b3a0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b3b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b3c0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b3d0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b3e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b3f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b400: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b410: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b420: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b430: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b440: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b460: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
b470: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 73  he cell pCell is
b480: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
b490: 6f 66 20 70 61 67 65 20 70 53 72 63 20 62 75 74  of page pSrc but
b4a0: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
b4b0: 20 62 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 70   be part.** of p
b4c0: 50 61 67 65 2e 20 20 28 70 53 72 63 20 61 6e 64  Page.  (pSrc and
b4d0: 20 70 50 61 67 65 72 20 61 72 65 20 6f 66 74 65   pPager are ofte
b4e0: 6e 20 74 68 65 20 73 61 6d 65 2e 29 20 20 49 66  n the same.)  If
b4f0: 20 70 43 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   pCell contains 
b500: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
b510: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b520: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
b530: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
b540: 65 72 2d 6d 61 70 20 66 6f 72 0a 2a 2a 20 74 68  er-map for.** th
b550: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
b560: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 61 6c  that will be val
b570: 69 64 20 61 66 74 65 72 20 70 43 65 6c 6c 20 68  id after pCell h
b580: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 74 6f  as been moved to
b590: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
b5a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
b5b0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
b5c0: 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
b5d0: 2a 70 53 72 63 2c 20 75 38 20 2a 70 43 65 6c 6c  *pSrc, u8 *pCell
b5e0: 2c 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65  ,int *pRC){.  Ce
b5f0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
b600: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
b610: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
b620: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
b630: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b640: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
b650: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
b660: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
b670: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
b680: 66 6c 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  fl;.    if( SQLI
b690: 54 45 5f 57 49 54 48 49 4e 28 70 53 72 63 2d 3e  TE_WITHIN(pSrc->
b6a0: 61 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c  aDataEnd, pCell,
b6b0: 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63   pCell+info.nLoc
b6c0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  al) ){.      tes
b6d0: 74 63 61 73 65 28 20 70 53 72 63 21 3d 70 50 61  tcase( pSrc!=pPa
b6e0: 67 65 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 43  ge );.      *pRC
b6f0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b700: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b710: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b720: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b730: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b740: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b750: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b760: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b770: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b780: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b790: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b7a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b7b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b7c0: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b7d0: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b7e0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b7f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b800: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b810: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b820: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b830: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b840: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b850: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b860: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b870: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b880: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b890: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b8a0: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b8b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b8c0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b8d0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b8e0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b8f0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b900: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b910: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b920: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b930: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b940: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b950: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b960: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b970: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b980: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b990: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b9a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b9b0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b9c0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b9d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b9e0: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b9f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba10: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ba20: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba40: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
ba50: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
ba60: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ba80: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
ba90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
baa0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bab0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bac0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
bad0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
bae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
baf0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
bb00: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
bb10: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
bb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb30: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
bb40: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bb50: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
bb80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bb90: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
bba0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
bbd0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
bbe0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
bbf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
bc00: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
bc10: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bc20: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bc30: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bc40: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bc50: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
bc60: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bc70: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bc80: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bc90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bca0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bcb0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bcd0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bce0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bcf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bd00: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bd10: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bd20: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bd30: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd60: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bdb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdd0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bde0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
be00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
be10: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
be20: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
be30: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be40: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be60: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be70: 61 5b 68 64 72 2b 33 5d 29 20 7c 7c 20 43 4f 52  a[hdr+3]) || COR
be80: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 69 43 65  RUPT_DB );.  iCe
be90: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bea0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
beb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bec0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bed0: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
bee0: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
bef0: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
bf00: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
bf10: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
bf20: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
bf30: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
bf40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
bf50: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
bf60: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
bf70: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
bf80: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
bf90: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
bfa0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
bfb0: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
bfc0: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
bfd0: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
bfe0: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
bff0: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
c000: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
c010: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
c020: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
c030: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
c040: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
c050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c060: 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46  +1]);.    if( iF
c070: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  ree>usableSize-4
c080: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c090: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c0a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 46  age);.    if( iF
c0b0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ree ){.      int
c0c0: 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79   iFree2 = get2by
c0d0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29  te(&data[iFree])
c0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  ;.      if( iFre
c0f0: 65 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e2>usableSize-4 
c100: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c110: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c120: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ge);.      if( 0
c130: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
c140: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
c150: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
c160: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
c170: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
c180: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
c190: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
c1a0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
c1b0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
c1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c1e0: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
c1f0: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
c200: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  );.        if( t
c220: 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20  op>=iFree ){.   
c230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c250: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c260: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c270: 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20  iFree2 ){.      
c280: 20 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a      if( iFree+sz
c290: 3e 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e  >iFree2 ) return
c2a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c2b0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c2c0: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
c2d0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
c2e0: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
c2f0: 20 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32    if( iFree2+sz2
c300: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20   > usableSize ) 
c310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c320: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
c340: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
c350: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
c360: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
c370: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
c380: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
c390: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z2;.        }els
c3a0: 65 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 75  e if( iFree+sz>u
c3b0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c3c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c3e0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c3f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 62 72    }..        cbr
c400: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c410: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c420: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c430: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c440: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c450: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c460: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c470: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c480: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c490: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c4a0: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4b0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4e0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4f0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c500: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c510: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c520: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c530: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c550: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c560: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c570: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c590: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c5a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5b0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5c0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5d0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5e0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5f0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c600: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c610: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c620: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c630: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c640: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c660: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c670: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c680: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c690: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c6a0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6b0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6c0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6d0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6f0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c700: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c720: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c730: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c740: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c750: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c760: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c770: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c780: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c790: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c7a0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7b0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7c0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7d0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c800: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c810: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c820: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c830: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c840: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c850: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c870: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c880: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c890: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c8a0: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8b0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8c0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8d0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8f0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c900: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c910: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c920: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c930: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c940: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c950: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c960: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c970: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c980: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c9a0: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9b0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9c0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9d0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c9f0: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
ca00: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
ca10: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
ca20: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
ca30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca40: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ca50: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
ca60: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
ca70: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
ca80: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ca90: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
caa0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
cab0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
cac0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
cad0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
cae0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
caf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cb00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
cb10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
cb20: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
cb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cb40: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
cb50: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
cb60: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
cb70: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
cb80: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
cb90: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
cba0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
cbb0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
cbc0: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
cbd0: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
cbe0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
cbf0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
cc00: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
cc10: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
cc20: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
cc30: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
cc40: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
cc50: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
cc60: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
cc70: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
cc80: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
cc90: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
cca0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ccb0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ccd0: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
cce0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ccf0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
cd00: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
cd10: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
cd20: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
cd30: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
cd40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
cd50: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
cd60: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
cd70: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
cd80: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
cd90: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
cda0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
cdb0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
cdc0: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
cdd0: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
cde0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
cdf0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ce00: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ce10: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
ce20: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  Page data */.  i
ce50: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
ce60: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
ce70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ce80: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 70  ress of ptr to p
ce90: 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20  c */.  int pc = 
cea0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ceb0: 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20 20 20  iAddr]);        
cec0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ced0: 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  a free slot */. 
cee0: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
cf10: 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20 74 68  xcess size of th
cf20: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e slot */.  int 
cf30: 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70 42 74  maxPC = pPg->pBt
cf40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e  ->usableSize - n
cf50: 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64  Byte;  /* Max ad
cf60: 64 72 65 73 73 20 66 6f 72 20 61 20 75 73 61 62  dress for a usab
cf70: 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  le slot */.  int
cf80: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cfb0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
cfc0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cfd0: 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  c>0 );.  while( 
cfe0: 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20  pc<=maxPC ){.   
cff0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d000: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
d010: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
d020: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
d030: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
d040: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
d050: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
d060: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
d070: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
d080: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
d090: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
d0a0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
d0b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
d0c0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
d0d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
d0e0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
d0f0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
d100: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
d110: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d120: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  3 );.      if( x
d130: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
d140: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d150: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
d160: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
d170: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
d180: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
d190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d1a0: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
d1b0: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
d1c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
d1d0: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
d1e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
d1f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
d200: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
d210: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
d220: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
d230: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
d240: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
d250: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
d260: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
d270: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
d280: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
d290: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
d2a0: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
d2b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b 70 63    }else if( x+pc
d2c0: 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20 20 20   > maxPC ){.    
d2d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74      /* This slot
d2e0: 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65   extends off the
d2f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73 61 62   end of the usab
d300: 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  le part of the p
d310: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  age */.        *
d320: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d330: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d350: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
d370: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
d380: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
d390: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
d3a0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
d3b0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
d3c0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
d3d0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
d3e0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
d3f0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
d400: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
d410: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
d420: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
d430: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
d440: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d450: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
d460: 20 20 20 69 66 28 20 70 63 3c 3d 69 41 64 64 72     if( pc<=iAddr
d470: 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  +size ){.      i
d480: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20 20  f( pc ){.       
d490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c 6f   /* The next slo
d4a0: 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 69  t in the chain i
d4b0: 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20 65  s not past the e
d4c0: 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
d4d0: 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  t slot */.      
d4e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
d4f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
d500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
d520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61  .  }.  if( pc>ma
d530: 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20  xPC+nByte-4 ){. 
d540: 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20 73     /* The free s
d550: 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e 64  lot chain extend
d560: 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  s off the end of
d570: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d580: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
d590: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
d5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d5c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d5d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d5e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d5f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d600: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d610: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d620: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d630: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d640: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d650: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d660: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d670: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d680: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d690: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d6a0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d6b0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d6c0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d6e0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d6f0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d700: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d710: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d720: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d730: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d740: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d750: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d760: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d770: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d780: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d790: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d7a0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d7b0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d7c0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d7d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d7e0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d7f0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d800: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d810: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d820: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d830: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d850: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d860: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d870: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d880: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d8a0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d8b0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d8c0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d8d0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d8e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d8f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d900: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d910: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d920: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d940: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d950: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d960: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d970: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d990: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d9a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d9c0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d9d0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d9e0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d9f0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
da00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
da10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
da20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
da30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
da40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
da50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
da60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
da70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
da80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
da90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
daa0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
dab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dac0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
dad0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dae0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
daf0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
db00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
db10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
db20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
db30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
db40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
db50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
db60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
db70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
db80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
db90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
dba0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
dbb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
dbc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
dbd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
dbe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
dbf0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
dc00: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
dc10: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
dc20: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
dc30: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
dc40: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
dc50: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
dc60: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
dc70: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
dc80: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
dc90: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
dca0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
dcb0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
dcc0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
dcd0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
dce0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
dcf0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
dd00: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
dd10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
dd20: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
dd30: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dd50: 2a 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74  * by btreeComput
dd60: 65 46 72 65 65 53 70 61 63 65 28 29 20 2a 2f 0a  eFreeSpace() */.
dd70: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
dd80: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
dd90: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
dda0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
ddb0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ddc0: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ddd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dde0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ddf0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
de00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
de10: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
de20: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
de30: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
de40: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
de50: 72 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  r,.  ** and if t
de60: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
de70: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
de80: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
de90: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
dea0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
deb0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
dec0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
ded0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dee0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
def0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
df00: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
df10: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
df20: 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32   if( (data[hdr+2
df30: 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d  ] || data[hdr+1]
df40: 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20  ) && gap+2<=top 
df50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63  ){.    u8 *pSpac
df60: 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  e = pageFindSlot
df70: 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26  (pPage, nByte, &
df80: 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70  rc);.    if( pSp
df90: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ace ){.      ass
dfa0: 65 72 74 28 20 70 53 70 61 63 65 2b 6e 42 79 74  ert( pSpace+nByt
dfb0: 65 3c 3d 64 61 74 61 2b 70 50 61 67 65 2d 3e 70  e<=data+pPage->p
dfc0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
dfd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
dfe0: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
dff0: 65 2d 64 61 74 61 29 29 3c 3d 67 61 70 20 29 7b  e-data))<=gap ){
e000: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e010: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e020: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
e030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e050: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
e060: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
e070: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e080: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e090: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
e0a0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
e0b0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
e0c0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
e0d0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
e0e0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
e0f0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
e100: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
e110: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
e120: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
e130: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
e140: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
e150: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
e160: 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
e170: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
e180: 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  >=0 );.    rc = 
e190: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
e1a0: 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61  Page, MIN(4, pPa
e1b0: 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e  ge->nFree - (2+n
e1c0: 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28  Byte)));.    if(
e1d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e1e0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
e1f0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
e200: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
e210: 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74  sert( gap+2+nByt
e220: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
e230: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
e240: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
e250: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
e260: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
e270: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
e280: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e290: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 43 6f  ea.  The btreeCo
e2a0: 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29  mputeFreeSpace()
e2b0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
e2c0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
e2d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
e2e0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
e2f0: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
e300: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
e310: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
e320: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
e330: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
e340: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
e350: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
e360: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
e370: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
e380: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
e390: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
e3a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e3b0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
e3c0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
e3d0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
e3e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
e3f0: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
e400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e410: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
e420: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
e430: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
e440: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
e450: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
e460: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
e470: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
e480: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
e490: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
e4a0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
e4b0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
e4c0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
e4d0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
e4e0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  alesced..**.** E
e4f0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
e500: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
e510: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
e520: 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61  eeComputeFreeSpa
e530: 63 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ce(),.** that ro
e540: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
e550: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
e560: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
e570: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
e580: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
e590: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
e5a0: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
e5b0: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
e5c0: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
e5d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e5e0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
e5f0: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
e600: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
e610: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
e620: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
e630: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
e640: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
e650: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e660: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e670: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e680: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e690: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e6a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e6d0: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e6e0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e6f0: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e710: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e720: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e730: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e760: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e770: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e780: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e7b0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e7c0: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e7d0: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7f0: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e800: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e810: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e840: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e850: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e860: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e880: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e890: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e8a0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e8b0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e8c0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e8d0: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e8e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e8f0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e900: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e910: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e920: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e930: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e940: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e950: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e960: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e970: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e980: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e990: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e9a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e9b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e9c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e9d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e9e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e9f0: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
ea00: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
ea10: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
ea20: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
ea30: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ea40: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
ea50: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
ea60: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
ea70: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
ea80: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
ea90: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
eaa0: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
eab0: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
eac0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
ead0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
eae0: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
eaf0: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
eb00: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
eb10: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
eb20: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
eb30: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
eb40: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
eb50: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
eb60: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
eb70: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
eb80: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
eb90: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
eba0: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
ebb0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
ebc0: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
ebd0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
ebe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ebf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ec00: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ec10: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
ec20: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
ec30: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
ec40: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
ec50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ec60: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
ec70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ec80: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ec90: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
eca0: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
ecb0: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
ecc0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
ecd0: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
ece0: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
ecf0: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
ed00: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
ed10: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
ed20: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
ed30: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
ed40: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
ed50: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
ed60: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
ed70: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
ed80: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
ed90: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
eda0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
edb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
edc0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
edd0: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
ede0: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
edf0: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
ee00: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
ee10: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
ee20: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ee30: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45  pPage);.      iE
ee40: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
ee50: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
ee60: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
ee70: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
ee80: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ee90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
eea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eeb0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eec0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eed0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
eee0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
eef0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
ef00: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
ef10: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
ef20: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
ef30: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
ef40: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
ef50: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
ef60: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
ef70: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
ef80: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
ef90: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
efa0: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
efb0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
efc0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
efd0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
efe0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
eff0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
f000: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
f010: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
f020: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
f030: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
f040: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
f050: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
f060: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
f070: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
f080: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
f090: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
f0a0: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
f0b0: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
f0c0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
f0d0: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
f0e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f0f0: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
f100: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
f110: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f120: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
f130: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
f140: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
f150: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
f160: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
f170: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
f180: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
f190: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
f1a0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
f1b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
f1c0: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
f1d0: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
f1e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
f1f0: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
f200: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
f210: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
f220: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
f230: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
f240: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f250: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f260: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
f270: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
f280: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
f290: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
f2a0: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
f2b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
f2c0: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
f2d0: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
f2e0: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
f2f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
f300: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
f310: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
f320: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
f330: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
f340: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
f350: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
f360: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
f370: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
f380: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
f390: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
f3a0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
f3b0: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
f3c0: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
f3d0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f3e0: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
f3f0: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
f400: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
f410: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
f420: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
f430: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
f440: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f450: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
f460: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
f470: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
f480: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
f490: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
f4a0: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
f4b0: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
f4c0: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
f4d0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
f4e0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
f4f0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
f500: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
f510: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
f520: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
f530: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
f540: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
f550: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
f560: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
f570: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
f580: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
f590: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f5a0: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
f5b0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f5c0: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
f5d0: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
f5e0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
f5f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
f600: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
f610: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f620: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
f630: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
f640: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
f650: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f660: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f670: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f680: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f690: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f6a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f6b0: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f6c0: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f6d0: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f6e0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f6f0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f700: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f710: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f720: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f730: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f740: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f750: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f760: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f770: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f780: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f790: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f7a0: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f7b0: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f7c0: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f7d0: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f7e0: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f7f0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f800: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f810: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f820: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f830: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f840: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f850: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f860: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f870: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f880: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f890: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f8a0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f8b0: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f8c0: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f8d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f8e0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f8f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f900: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f910: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f920: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f930: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f940: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f950: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f960: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f970: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f980: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f990: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f9a0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f9b0: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f9c0: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f9d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f9e0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f9f0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
fa00: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
fa10: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
fa20: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
fa30: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
fa40: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
fa50: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
fa60: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
fa70: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
fa80: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
fa90: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
faa0: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
fab0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
fac0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
fad0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
fae0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
faf0: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
fb00: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
fb10: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
fb20: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
fb30: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
fb40: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
fb50: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
fb60: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
fb70: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
fb80: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
fb90: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
fba0: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
fbb0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
fbc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
fbd0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
fbe0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
fbf0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
fc00: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
fc10: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
fc20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fc30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fc40: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
fc50: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
fc60: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
fc70: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
fc80: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
fc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fca0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
fcb0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
fcc0: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
fcd0: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
fce0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
fcf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fd00: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
fd10: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 73   amount of frees
fd20: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
fd30: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
fd40: 73 2c 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68  s, fill.** in th
fd50: 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 66  e pPage->nFree f
fd60: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
fd70: 69 6e 74 20 62 74 72 65 65 43 6f 6d 70 75 74 65  int btreeCompute
fd80: 46 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  FreeSpace(MemPag
fd90: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
fda0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
fdb0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
fdc0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
fdd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
fde0: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
fe00: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
fe10: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
fe20: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
fe30: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
fe40: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
fe50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
fe60: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
fe70: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
fe80: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
fe90: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
fea0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
feb0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
fec0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
fed0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
fee0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
fef0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ff00: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ff10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
ff20: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
ff30: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
ff40: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
ff50: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
ff60: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
ff70: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
ff80: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ff90: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ffa0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ffb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ffc0: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
ffd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ffe0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
fff0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10010 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
10020 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
10030 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10050 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
10060 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
10070 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
10080 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10090 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
100a0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
100b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
100c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
100d0 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61  isInit==1 );.  a
100e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
100f0 72 65 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62  ree<0 );..  usab
10100 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
10110 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
10120 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
10130 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
10140 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
10150 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
10160 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
10170 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
10180 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
10190 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
101a0 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
101b0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
101c0 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61   area. A zero va
101d0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74  lue for this int
101e0 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74  eger is.  ** int
101f0 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33  erpreted as 6553
10200 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  6. */.  top = ge
10210 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
10220 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
10230 43 65 6c 6c 46 69 72 73 74 20 3d 20 68 64 72 20  CellFirst = hdr 
10240 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
10250 6c 64 50 74 72 53 69 7a 65 20 2b 20 32 2a 70 50  ldPtrSize + 2*pP
10260 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43  age->nCell;.  iC
10270 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
10280 53 69 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20  Size - 4;..  /* 
10290 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
102a0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
102b0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
102c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
102d0 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
102e0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
102f0 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
10300 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
10310 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
10320 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
10330 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
10340 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
10350 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
10360 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
10370 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
10380 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
10390 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
103a0 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
103b0 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
103c0 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
103d0 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
103e0 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
103f0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10400 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
10410 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10420 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
10430 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
10440 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
10450 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
10460 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
10470 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
10480 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
10490 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
104a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
104b0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
104c0 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20  Page); .    }.  
104d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
104e0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
104f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10500 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
10510 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10520 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
10530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10540 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10560 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
10570 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
10580 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
10590 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
105a0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
105b0 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
105c0 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
105d0 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
105e0 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
105f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10600 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
10610 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
10620 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
10630 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
10640 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10650 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b     }.    if( pc+
10670 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
10680 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
10690 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66  .      /* Last f
106a0 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  reeblock extends
106b0 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a   past page end *
106c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
106d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
106e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
106f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
10700 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
10710 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
10720 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
10730 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
10740 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10750 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
10760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
10770 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
10780 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
10790 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
107a0 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
107b0 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
107c0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
107d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
107e0 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
107f0 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
10800 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
10810 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
10820 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10830 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10840 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
10850 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
10860 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
10870 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
10880 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
10890 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
108a0 62 6c 65 53 69 7a 65 20 7c 7c 20 6e 46 72 65 65  bleSize || nFree
108b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
108c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
108d0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
108e0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
108f0 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10900 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
10910 72 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  rst);.  return S
10920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10930 2a 2a 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  ** Do additional
10940 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 61 66   sanity check af
10950 74 65 72 20 62 74 72 65 65 49 6e 69 74 50 61 67  ter btreeInitPag
10960 65 28 29 20 69 66 0a 2a 2a 20 50 52 41 47 4d 41  e() if.** PRAGMA
10970 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
10980 3d 4f 4e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 53  =ON .*/.static S
10990 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
109a0 6e 74 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65  nt btreeCellSize
109b0 43 68 65 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  Check(MemPage *p
109c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 43 65  Page){.  int iCe
109d0 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
109e0 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
109f0 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
10a00 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74   offset */.  int
10a10 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
10a20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
10a30 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
10a40 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
10a50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10a60 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
10a70 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
10a80 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
10a90 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sz;            /
10aa0 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
10ab0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10ad0 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
10ae0 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
10af0 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
10b00 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
10b10 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
10b20 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
10b30 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
10b40 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 73 61    /* Maximum usa
10b50 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ble space on the
10b60 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
10b70 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
10b80 20 53 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63   Start of cell c
10b90 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a  ontent area */..
10ba0 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 70    iCellFirst = p
10bb0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
10bc0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10bd0 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  l;.  usableSize 
10be0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
10bf0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
10c00 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
10c10 7a 65 20 2d 20 34 3b 0a 20 20 64 61 74 61 20 3d  ze - 4;.  data =
10c20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10c30 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
10c40 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
10c50 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
10c60 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
10c70 2d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  -;.  for(i=0; i<
10c80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
10c90 2b 29 7b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  +){.    pc = get
10ca0 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61  2byteAligned(&da
10cb0 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
10cc0 32 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  2]);.    testcas
10cd0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
10ce0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
10cf0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
10d00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69   );.    if( pc<i
10d10 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
10d20 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10d40 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10d50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
10d60 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
10d70 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
10d80 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 74 65 73  ta[pc]);.    tes
10d90 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
10da0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
10db0 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
10dc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
10dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10de0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10e10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
10e20 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
10e30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10e40 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
10e50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10e60 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10e70 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
10e80 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
10e90 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
10ea0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
10eb0 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
10ec0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
10ed0 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
10ee0 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
10ef0 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
10f00 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
10f10 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
10f20 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
10f30 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
10f40 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
10f50 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
10f60 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
10f70 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
10f80 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
10f90 2a 70 50 61 67 65 29 7b 0a 20 20 75 38 20 2a 64  *pPage){.  u8 *d
10fa0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
10fb0 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
10fc0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68  >aData */.  BtSh
10fd0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
10fe0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
10ff0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
11000 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11010 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
11020 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
11030 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
11040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11050 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11060 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11080 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
11090 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
110a0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
110b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
110c0 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
110d0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
110e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
110f0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
11100 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
11110 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
11120 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11130 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
11140 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
11150 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11160 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
11170 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 68 64  Data + pPage->hd
11180 72 4f 66 66 73 65 74 3b 0a 20 20 2f 2a 20 45 56  rOffset;.  /* EV
11190 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
111a0 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
111b0 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
111c0 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
111d0 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65  g.  ** the b-tre
111e0 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
111f0 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
11200 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 30 5d  s(pPage, data[0]
11210 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11230 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
11240 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11250 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11260 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
11270 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11280 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11290 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
112a0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
112b0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
112c0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
112d0 74 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  t = pPage->hdrOf
112e0 66 73 65 74 20 2b 20 38 20 2b 20 70 50 61 67 65  fset + 8 + pPage
112f0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
11300 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
11310 78 20 3d 20 64 61 74 61 20 2b 20 70 50 61 67 65  x = data + pPage
11320 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2b  ->childPtrSize +
11330 20 38 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61   8;.  pPage->aDa
11340 74 61 45 6e 64 20 3d 20 70 50 61 67 65 2d 3e 61  taEnd = pPage->a
11350 44 61 74 61 20 2b 20 70 42 74 2d 3e 75 73 61 62  Data + pBt->usab
11360 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d  leSize;.  pPage-
11370 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 70 50 61  >aDataOfst = pPa
11380 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67  ge->aData + pPag
11390 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
113a0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
113b0 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
113c0 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
113d0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
113e0 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
113f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
11400 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
11410 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
11420 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
11430 5b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  [3]);.  if( pPag
11440 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
11450 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
11460 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
11470 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
11480 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
11490 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
114a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114b0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
114c0 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  ge);.  }.  testc
114d0 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
114e0 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
114f0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
11500 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
11510 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
11520 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
11530 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
11540 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
11550 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
11560 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
11570 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
11580 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73  en the.  ** offs
11590 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
115a0 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
115b0 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
115c0 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
115d0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
115e0 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
115f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11600 3e 6e 43 65 6c 6c 3e 30 0a 20 20 20 20 20 20 20  >nCell>0.       
11610 7c 7c 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  || get2byteNotZe
11620 72 6f 28 26 64 61 74 61 5b 35 5d 29 3d 3d 28 69  ro(&data[5])==(i
11630 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
11640 7a 65 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  ze.       || COR
11650 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 70 50 61  RUPT_DB );.  pPa
11660 67 65 2d 3e 6e 46 72 65 65 20 3d 20 2d 31 3b 20  ge->nFree = -1; 
11670 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61   /* Indicate tha
11680 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  t this value is 
11690 79 65 74 20 75 6e 63 6f 6d 70 75 74 65 64 20 2a  yet uncomputed *
116a0 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  /.  pPage->isIni
116b0 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 42 74  t = 1;.  if( pBt
116c0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
116d0 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20  LITE_CellSizeCk 
116e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
116f0 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b  reeCellSizeCheck
11700 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
11710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
11730 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
11740 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
11750 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
11760 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
11770 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
11780 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
11790 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
117a0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
117b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
117c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
117d0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
117e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
117f0 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
11800 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
11810 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
11820 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11830 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
11840 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11850 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
11860 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11870 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11880 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11890 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
118a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
118b0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
118c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
118d0 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
118e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
118f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
11900 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
11910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11920 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11930 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
11940 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
11950 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29  TS_FAST_SECURE )
11960 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
11970 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
11980 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
11990 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
119a0 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
119b0 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
119c0 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
119d0 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
119e0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
119f0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
11a00 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
11a10 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
11a20 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
11a30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
11a40 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
11a50 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
11a60 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
11a70 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
11a80 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
11a90 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
11aa0 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
11ab0 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
11ac0 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
11ad0 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
11ae0 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
11af0 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
11b00 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
11b10 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
11b20 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  trSize];.  pPage
11b30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
11b40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11b50 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11b60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
11b70 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
11b80 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
11b90 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
11ba0 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
11bb0 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
11bc0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
11bd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
11be0 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
11bf0 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
11c00 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
11c10 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
11c20 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
11c30 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
11c40 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
11c50 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
11c60 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
11c70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
11c80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11c90 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
11ca0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11cb0 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
11cc0 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e  f( pgno!=pPage->
11cd0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
11ce0 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
11cf0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61  DbPage);.    pPa
11d10 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
11d20 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65  bPage;.    pPage
11d30 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
11d40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
11d50 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  gno;.    pPage->
11d60 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
11d70 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
11d80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
11d90 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  ge->aData==sqlit
11da0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11db0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
11dc0 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
11dd0 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
11de0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
11df0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11e00 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
11e10 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
11e20 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
11e30 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
11e40 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
11e50 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
11e60 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
11e70 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
11e80 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
11e90 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
11ea0 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
11eb0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
11ec0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
11ed0 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
11ee0 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
11ef0 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
11f00 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
11f10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
11f20 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
11f30 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
11f40 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
11f50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
11f60 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
11f70 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
11f80 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
11f90 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
11fa0 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
11fb0 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
11fc0 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
11fd0 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
11fe0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
11ff0 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
12000 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
12010 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
12020 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12040 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
12050 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
12060 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
12070 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
12080 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
12090 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
120a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
120b0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
120c0 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
120d0 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
120e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
120f0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
12100 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
12110 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
12120 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
12130 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
12140 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
12150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12170 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
12180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
12190 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
121a0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
121b0 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
121c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
121d0 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
121e0 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
121f0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12200 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
12210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
12230 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
12240 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
12250 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
12260 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
12270 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
12280 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
12290 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
122a0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
122b0 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
122c0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
122d0 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
122e0 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
122f0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
12300 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
12310 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
12320 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12330 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12340 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
12350 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
12360 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
12370 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
12380 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
12390 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
123a0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
123b0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
123c0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
123d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
123e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
123f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12410 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
12420 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
12430 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
12440 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
12450 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
12460 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
12470 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
12480 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
12490 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
124a0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
124b0 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
124c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
124d0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
124e0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
124f0 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
12500 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20  &0x80000000)==0 
12510 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
12520 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
12530 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
12540 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
12550 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
12560 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
12570 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
12580 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
12590 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
125a0 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
125b0 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
125c0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
125d0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
125e0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
125f0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
12600 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
12610 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
12620 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
12630 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
12640 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
12650 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
12660 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
12670 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
12680 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
12690 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
126a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
126b0 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
126c0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
126d0 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
126e0 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
126f0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
12700 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
12710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
12720 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
12730 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12760 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
12770 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
12780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12790 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127a0 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
127b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
127c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
127d0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
127e0 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
127f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
12820 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
12830 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
12840 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
12850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12860 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
12870 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
12880 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
12890 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
128a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
128b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
128c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
128d0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
128e0 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67  age==&pCur->pPag
128f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
12900 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
12910 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
12920 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
12930 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12940 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
12950 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
12960 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
12970 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
12980 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12990 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
129a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
129b0 31 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  1;.  }.  rc = sq
129c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
129d0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
129e0 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
129f0 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b  age, bReadOnly);
12a00 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12a10 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12a20 50 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d  Page_error1;.  }
12a30 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12a40 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12a50 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12a60 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12a70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12a80 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12a90 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12aa0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12ab0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12ac0 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12af0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12b00 50 61 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 20  Page_error2;.   
12b10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12b20 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
12b30 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
12b40 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
12b50 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
12b60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
12b70 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
12b80 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
12b90 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
12ba0 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
12bb0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
12bc0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
12bd0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
12be0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
12bf0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
12c00 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
12c10 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
12c20 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
12c30 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
12c40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12c50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 67  GNO(pgno);.    g
12c60 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12c70 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 7d 0a 20  ge_error2;.  }. 
12c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c90 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
12ca0 67 65 5f 65 72 72 6f 72 32 3a 0a 20 20 72 65 6c  ge_error2:.  rel
12cb0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12cc0 29 3b 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  );.getAndInitPag
12cd0 65 5f 65 72 72 6f 72 31 3a 0a 20 20 69 66 28 20  e_error1:.  if( 
12ce0 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72  pCur ){.    pCur
12cf0 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70  ->iPage--;.    p
12d00 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
12d10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
12d20 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65  iPage];.  }.  te
12d30 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
12d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
12d50 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
12d60 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
12d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12d80 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
12d90 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
12da0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
12db0 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
12dc0 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
12dd0 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  eeGetPage..**.**
12de0 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65 63   Page1 is a spec
12df0 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73  ial case and mus
12e00 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 73  t be released us
12e10 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f  ing releasePageO
12e20 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ne()..*/.static 
12e30 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12e40 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20  NotNull(MemPage 
12e50 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
12e60 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
12e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12e80 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
12e90 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
12ea0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
12eb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12ec0 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
12ed0 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
12ee0 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
12ef0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12f00 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
12f10 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
12f20 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
12f30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12f40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
12f50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12f60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
12f70 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
12f80 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  pDbPage);.}.stat
12f90 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12fa0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
12fb0 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
12fc0 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f   ) releasePageNo
12fd0 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a  tNull(pPage);.}.
12fe0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12ff0 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61  asePageOne(MemPa
13000 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
13010 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
13020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13030 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
13040 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
13050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13060 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
13070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13080 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
13090 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
130a0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
130b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
130c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
130d0 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
130e0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
130f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13110 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
13120 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13130 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
13140 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
13150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
13160 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a  an unused page..
13170 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
13180 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65   just like btree
13190 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74  GetPage() with t
131a0 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a  he addition:.**.
131b0 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70  **   *  If the p
131c0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
131d0 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  n use for some o
131e0 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d  ther purpose, im
131f0 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
13200 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64    release it and
13210 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
13220 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CURRUPT error.
13230 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75  .**   *  Make su
13240 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c  re the isInit fl
13250 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73  ag is clear.*/.s
13260 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
13270 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20  etUnusedPage(.  
13280 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
13290 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
132a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
132b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
132c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
132d0 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
132e0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
132f0 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
13300 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
13310 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
13320 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
13330 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
13340 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
13350 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
13360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13370 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
13380 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
13390 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
133a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
133b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
133c0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
133d0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
133e0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
133f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
13400 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
13410 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
13420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13430 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13440 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
13450 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
13460 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
13470 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
13480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13490 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
134a0 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
134b0 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
134c0 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
134d0 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
134e0 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
134f0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
13500 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
13510 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
13520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13530 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
13540 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
13550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
13560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13570 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
13580 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
13590 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
135a0 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
135b0 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
135c0 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
135d0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
135e0 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
135f0 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
13600 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
13610 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
13620 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
13630 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
13640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13650 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
13660 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
13670 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
13680 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
13690 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
136a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
136b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
136c0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
136d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
136e0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
136f0 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
13700 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
13710 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
13720 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
13730 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
13740 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
13750 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
13760 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
13770 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
13780 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
13790 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
137a0 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
137b0 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
137c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
137d0 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
137e0 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
137f0 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
13800 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
13810 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
13820 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
13830 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
13840 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
13850 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
13860 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
13870 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
13880 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
13890 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
138a0 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
138b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
138c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
138d0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
138e0 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
138f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13900 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
13910 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
13920 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
13930 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
13940 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
13950 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
13960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
13980 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
13990 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
139a0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
139b0 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
139c0 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ler,.           
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
139f0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
13a00 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ger));.}../*.** 
13a10 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
13a20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
13a30 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
13a40 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
13a50 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
13a60 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
13a70 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
13a80 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
13a90 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
13aa0 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13ab0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
13ac0 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
13ad0 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
13ae0 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
13af0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
13b00 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
13b10 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13b20 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
13b30 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
13b40 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
13b50 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
13b60 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
13b70 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13b80 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
13b90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13ba0 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
13bb0 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
13bc0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
13bd0 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
13be0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
13bf0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
13c00 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
13c10 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
13c20 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
13c30 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
13c40 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
13c50 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
13c60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
13c70 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
13c80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
13c90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13ca0 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
13cb0 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
13cc0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
13cd0 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
13ce0 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
13cf0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
13d00 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
13d10 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
13d20 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
13d30 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
13d40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13d50 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
13d60 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
13d70 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
13d80 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
13d90 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
13da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13db0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
13dc0 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
13dd0 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
13de0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13df0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
13e00 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
13e10 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
13e20 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
13e30 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
13e40 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
13e50 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
13e60 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
13e70 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
13e80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
13e90 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
13ea0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
13eb0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
13ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
13ed0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
13ee0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
13ef0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
13f00 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
13f10 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
13f20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
13f30 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
13f40 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
13f50 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
13f60 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
13f70 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f90 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
13fa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
13fb0 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
13fc0 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
13fd0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
13fe0 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
13ff0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
14000 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
14010 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
14020 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
14030 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
14040 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
14050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
14060 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
14070 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
14080 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14090 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
140a0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
140b0 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
140c0 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
140d0 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
140e0 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
140f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
14100 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
14110 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
14120 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
14130 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
14140 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
14150 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
14160 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14170 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
14180 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
14190 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
141a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
141b0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
141c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
141d0 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
141e0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
141f0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
14200 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
14210 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
14220 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
14230 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
14240 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
14250 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
14260 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
14270 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
14280 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
14290 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
142a0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
142b0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
142c0 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
142d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
142e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
142f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14300 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
14310 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
14320 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
14330 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
14340 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
14350 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
14360 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
14370 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
14380 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
14390 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
143a0 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
143b0 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
143c0 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
143d0 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
143e0 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
143f0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
14400 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
14410 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
14420 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
14430 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
14440 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
14450 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
14460 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
14470 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
14480 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14490 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
144a0 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
144b0 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
144c0 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
144d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
144e0 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
144f0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
14500 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14510 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
14520 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
14530 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14540 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14550 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
14560 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14570 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
14580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14590 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
145a0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
145b0 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
145c0 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
145d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
145e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
145f0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
14600 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14610 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
14620 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
14630 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
14640 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
14650 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
14660 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
14670 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
14680 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
14690 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
146a0 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
146b0 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
146c0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
146d0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
146e0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
146f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
14700 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
14710 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
14720 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
14730 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
14740 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
14750 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
14760 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
14770 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
14780 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
14790 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
147a0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
147b0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
147c0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
147d0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
147e0 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
147f0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
14800 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
14810 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
14820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14830 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
14840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14850 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
14860 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
14870 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
14880 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
14890 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
148a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
148b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
148c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
148d0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
148e0 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
14910 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
14920 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
14930 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14950 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14960 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
14970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14980 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
14990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
149a0 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
149b0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
149c0 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
149d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
149e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
149f0 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
14a00 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a10 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
14a20 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
14a30 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
14a40 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14a50 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
14a60 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
14a70 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14a80 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
14a90 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
14aa0 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
14ab0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14ac0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
14ad0 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
14ae0 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
14af0 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
14b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
14b10 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
14b20 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
14b30 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
14b40 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
14b60 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
14b70 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
14b80 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
14b90 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
14ba0 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
14bb0 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
14bc0 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
14bd0 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
14be0 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
14bf0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
14c00 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
14c10 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
14c20 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
14c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14c50 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14c60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14c80 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
14c90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14ca0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
14cb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
14cc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14cd0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14cf0 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
14d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14d20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
14d30 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
14d40 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
14d50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
14d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14d70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14d80 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14da0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
14db0 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
14dc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14dd0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
14de0 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
14df0 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
14e00 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
14e10 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
14e20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
14e30 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
14e40 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
14e50 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
14e60 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
14e70 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
14e80 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
14e90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14ea0 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
14eb0 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
14ec0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
14ed0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14ee0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
14ef0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
14f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14f10 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
14f20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
14f30 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
14f40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
14f50 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
14f60 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
14f70 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
14f80 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
14f90 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
14fa0 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
14fb0 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
14fc0 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
14fd0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
14fe0 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
14ff0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
15000 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
15010 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15020 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
15030 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15040 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
15050 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15060 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
15070 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
15080 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
15090 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
150a0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
150b0 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
150c0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
150d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
150e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
150f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15100 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
15110 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15120 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
15130 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
15140 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15160 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66  zeof(MemPage), f
15170 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
15180 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
15190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
151a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
151b0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
151c0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
151d0 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20  , db->szMmap);. 
151e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
151f0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
15200 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
15210 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
15220 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
15230 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
15240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15250 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15260 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
15270 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67     pBt->openFlag
15280 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20  s = (u8)flags;. 
15290 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
152a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
152b0 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28  rSetBusyHandler(
152c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
152d0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
152e0 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
152f0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
15300 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
15310 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
15320 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69  Page1 = 0;.    i
15330 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  f( sqlite3PagerI
15340 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
15350 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74  Pager) ) pBt->bt
15360 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
15370 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66  AD_ONLY;.#if def
15380 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55  ined(SQLITE_SECU
15390 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70  RE_DELETE).    p
153a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
153b0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
153c0 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  E;.#elif defined
153d0 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43  (SQLITE_FAST_SEC
153e0 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
153f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15400 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a   BTS_OVERWRITE;.
15410 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
15420 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
15430 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
15440 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
15450 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
15460 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
15470 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
15480 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
15490 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
154a0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
154b0 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
154c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
154d0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
154e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
154f0 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
15500 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
15510 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
15520 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
15530 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
15540 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
15550 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
15560 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
15570 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
15580 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
15590 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
155a0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
155b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
155c0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
155d0 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
155e0 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
155f0 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
15600 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
15610 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
15620 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
15630 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
15640 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
15650 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
15660 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15670 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
15680 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
15690 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
156a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
156b0 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
156c0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
156d0 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
156e0 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
156f0 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
15700 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15710 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
15720 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
15730 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
15740 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
15750 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
15760 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
15770 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
15780 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15790 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
157a0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
157b0 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
157c0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
157d0 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
157e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
157f0 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
15800 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15810 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
15820 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
15830 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
15840 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
15850 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
15860 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
15870 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
15880 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
15890 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
158a0 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
158b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
158c0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
158d0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
158e0 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
158f0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
15900 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
15910 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
15920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15930 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
15940 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
15950 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
15960 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
15970 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
15980 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
15990 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
159a0 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
159b0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
159c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
159d0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
159e0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
159f0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
15a00 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
15a10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
15a20 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15a30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15a40 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
15a50 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
15a60 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
15a70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
15a80 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
15a90 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
15aa0 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
15ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15ac0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15ad0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15ae0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
15af0 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
15b00 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
15b10 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
15b20 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
15b30 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
15b40 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  */.    pBt->nRef
15b50 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 1;.    if( p-
15b60 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15b70 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
15b80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
15b90 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
15ba0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
15bb0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
15bc0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15bd0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15be0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
15bf0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
15c00 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
15c10 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15c20 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
15c30 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
15c40 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
15c50 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c60 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
15c70 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
15c80 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
15c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15ca0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
15cb0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15cc0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
15cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15ce0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15cf0 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
15d00 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
15d10 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
15d20 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15d30 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
15d40 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
15d50 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15d60 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
15d70 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
15d80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15d90 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
15da0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
15db0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15dc0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15dd0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
15de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
15df0 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
15e00 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
15e10 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
15e20 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
15e30 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
15e40 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
15e50 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
15e60 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
15e70 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
15e80 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
15e90 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
15ea0 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
15eb0 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
15ec0 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
15ed0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
15ee0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
15ef0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15f00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15f10 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
15f20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
15f30 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
15f40 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
15f50 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
15f60 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
15f70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
15f80 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29        if( (uptr)
15f90 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69  p->pBt<(uptr)pSi
15fa0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
15fb0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
15fc0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
15fd0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
15fe0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
15ff0 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
16000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16010 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
16020 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69  ext && (uptr)pSi
16030 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75  b->pNext->pBt<(u
16040 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20  ptr)p->pBt ){.  
16050 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
16060 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
16070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16080 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
16090 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
160a0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
160b0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
160c0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
160d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
160e0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
160f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16100 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
16110 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
16120 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
16130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16140 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
16150 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
16160 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
16170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16180 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
16190 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
161a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
161b0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
161c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
161d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
161e0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
161f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
16200 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
16210 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
16220 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
16230 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
16240 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
16250 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
16260 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
16270 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
16280 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
16290 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
162a0 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
162b0 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
162c0 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
162d0 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
162e0 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
162f0 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
16300 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
16310 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
16320 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
16330 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16340 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
16350 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
16360 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
16370 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  E);.    }..    p
16380 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
16390 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
163a0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ger);.    if( pF
163b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
163c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
163d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
163e0 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
163f0 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29  NTL_PDB, (void*)
16400 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  &pBt->db);.    }
16410 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
16420 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
16430 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16440 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
16450 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
16460 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
16470 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
16480 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
16490 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
164a0 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
164b0 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
164c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
164d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
164e0 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
164f0 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
16500 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
16510 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
16520 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
16530 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
16540 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
16550 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
16560 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
16570 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
16580 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
16590 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
165a0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
165b0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
165c0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
165d0 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
165e0 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
165f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16600 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
16610 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
16620 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
16630 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
16640 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
16650 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
16660 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16670 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
16680 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
16690 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
166a0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
166b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
166c0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
166d0 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
166e0 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
166f0 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
16700 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
16710 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
16720 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16730 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16740 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
16750 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
16760 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
16770 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
16780 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
16790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
167a0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
167b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
167c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
167d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
167e0 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
167f0 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
16800 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
16810 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
16820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16830 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
16840 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
16850 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
16860 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
16870 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
16880 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
16890 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
168a0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
168b0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
168c0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
168d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
168e0 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
168f0 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
16900 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
16910 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
16920 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
16930 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
16940 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
16950 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
16960 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
16970 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
16980 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
16990 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
169a0 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
169b0 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
169c0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
169d0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
169e0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
169f0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
16a00 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
16a10 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
16a20 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
16a30 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
16a40 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
16a50 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
16a60 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
16a70 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
16a80 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
16a90 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
16aa0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
16ab0 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
16ac0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
16ad0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
16ae0 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
16af0 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
16b00 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
16b10 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
16b20 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
16b30 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
16b40 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
16b50 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
16b60 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
16b70 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
16b80 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
16b90 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
16ba0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
16bb0 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
16bc0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
16bd0 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
16be0 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
16bf0 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
16c00 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
16c10 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
16c20 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
16c30 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
16c40 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
16c50 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
16c60 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
16c70 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
16c80 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
16c90 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
16ca0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
16cb0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
16cc0 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
16cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
16ce0 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
16cf0 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
16d00 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
16d10 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
16d20 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
16d30 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
16d40 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
16d50 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
16d60 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
16d70 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
16d80 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
16d90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
16da0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
16db0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
16dc0 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
16dd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
16de0 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
16df0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16e00 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
16e10 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
16e20 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
16e30 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
16e40 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16e50 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
16e60 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
16e70 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
16e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
16e90 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
16ea0 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
16eb0 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
16ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
16ed0 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
16ee0 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
16ef0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
16f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16f10 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
16f20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16f30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
16f40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
16f50 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
16f60 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
16f70 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
16f80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
16f90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16fa0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16fb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16fc0 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
16fd0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
16fe0 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
16ff0 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
17000 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
17010 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
17020 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
17030 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
17040 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17050 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
17060 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
17070 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
17080 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
17090 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
170a0 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
170b0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
170c0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
170d0 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
170e0 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
170f0 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
17100 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
17110 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
17120 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
17130 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
17140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17150 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
17160 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
17170 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
17180 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
17190 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
171a0 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
171b0 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
171c0 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
171d0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
171e0 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
171f0 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
17200 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
17210 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
17220 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
17230 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
17240 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
17250 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
17260 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
17270 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
17280 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
17290 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
172a0 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
172b0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
172c0 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
172d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
172e0 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
172f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
17300 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
17310 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
17320 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
17330 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
17340 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
17350 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  db);.    if( pBt
17360 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
17370 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
17380 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
17390 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
173a0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
173b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
173c0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
173d0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
173e0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
173f0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
17400 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
17410 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17420 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
17430 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
17440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17450 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
17460 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
17470 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
17480 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
17490 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
174a0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
174b0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
174c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
174d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
174e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
174f0 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
17500 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
17510 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17520 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
17530 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
17540 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
17550 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
17560 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
17570 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
17580 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
17590 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
175a0 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
175b0 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
175c0 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
175d0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
175e0 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
175f0 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
17600 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
17610 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
17620 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17630 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
17640 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
17650 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
17660 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17670 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
17680 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17690 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
176a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
176b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
176c0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
176d0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
176e0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
176f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17700 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17720 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
17730 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
17740 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17750 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
17760 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
17770 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
17780 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
17790 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
177a0 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
177b0 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
177c0 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
177d0 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
177e0 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
177f0 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
17800 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
17810 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
17820 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
17830 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
17840 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
17850 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
17860 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
17870 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
17880 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
17890 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
178a0 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
178b0 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
178c0 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
178d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
178e0 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
178f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17900 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
17910 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17920 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
17930 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17940 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17950 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17960 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17970 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
17980 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
17990 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
179a0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
179b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
179c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
179d0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
179e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
179f0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17a00 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
17a10 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
17a20 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
17a30 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
17a40 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
17a50 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
17a60 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
17a70 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
17a80 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
17a90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17ab0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17ac0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17ae0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17af0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
17b00 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
17b10 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
17b20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17b40 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
17b50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17b60 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
17b70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
17b80 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
17b90 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
17ba0 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
17bb0 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
17bc0 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
17bd0 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
17be0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
17bf0 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
17c00 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
17c10 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
17c20 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
17c30 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
17c40 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
17c50 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
17c60 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
17c70 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
17c80 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
17c90 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
17ca0 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
17cb0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17cc0 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
17cd0 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
17ce0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17cf0 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
17d00 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
17d10 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
17d20 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
17d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
17d40 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
17d50 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
17d60 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
17d70 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
17d80 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
17d90 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
17da0 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
17db0 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
17dc0 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
17dd0 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
17de0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
17df0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17e00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17e10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17e20 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17e40 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
17e50 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
17e60 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
17e70 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
17e80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17ea0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17eb0 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
17ec0 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
17ed0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
17ee0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
17ef0 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
17f00 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
17f10 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
17f20 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
17f30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17f40 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
17f50 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
17f60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
17f70 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
17f80 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
17f90 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
17fa0 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
17fb0 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
17fc0 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
17fd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
17fe0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
17ff0 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
18000 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
18010 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
18020 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
18030 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
18040 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
18050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18060 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
18070 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
18080 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
18090 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
180a0 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
180b0 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
180c0 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
180d0 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
180e0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
180f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
18100 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
18110 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
18120 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
18130 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
18140 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
18150 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18160 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
18170 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
18180 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
18190 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
181a0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
181b0 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
181c0 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
181d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
181e0 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
181f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
18200 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
18210 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
18220 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
18230 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
18240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
18250 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18260 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
18270 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
18280 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
18290 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
182a0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
182b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
182c0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
182d0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
182e0 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
182f0 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
18300 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
18310 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
18320 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
18330 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
18340 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18350 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
18360 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
18370 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
18380 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
18390 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
183a0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
183b0 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
183c0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
183d0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
183e0 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
183f0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
18400 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
18410 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
18420 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
18430 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
18440 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
18450 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
18460 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
18470 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
18480 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
18490 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
184a0 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
184b0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
184c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
184d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
184e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
184f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
18500 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
18510 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
18520 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
18530 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
18540 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
18550 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
18560 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
18570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18580 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
185a0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
185b0 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
185c0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
185d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
185e0 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
185f0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
18600 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
18610 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18620 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
18630 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
18640 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
18650 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
18660 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
18670 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
18680 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
18690 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
186a0 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
186b0 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
186c0 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
186d0 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
186e0 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
186f0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
18700 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
18710 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
18720 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
18730 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
18740 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
18750 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
18760 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
18770 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
18780 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
18790 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
187a0 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
187b0 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
187c0 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
187d0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
187e0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
187f0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
18800 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
18810 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18820 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
18830 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
18840 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
18850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18860 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
18870 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
18880 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
18890 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
188a0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
188b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
188c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
188d0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
188e0 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
188f0 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
18900 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
18910 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
18920 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
18930 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
18940 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
18950 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
18960 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
18970 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
18980 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
18990 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
189a0 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
189b0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
189c0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
189d0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
189e0 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
189f0 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
18a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18a10 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
18a20 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
18a30 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
18a40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
18a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18a60 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
18a70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
18a80 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
18a90 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
18aa0 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
18ab0 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
18ac0 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
18ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18ae0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18af0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
18b00 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
18b10 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
18b20 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
18b30 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
18b40 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
18b50 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
18b60 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
18b70 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
18b80 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
18b90 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
18ba0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
18bb0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
18bc0 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
18bd0 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
18be0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
18bf0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
18c00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18c10 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
18c20 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
18c30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
18c40 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
18c50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18c60 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
18c70 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
18c80 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54 53  lues for the BTS
18c90 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
18ca0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
18cb0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
18cc0 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20   newFlag==0     
18cd0 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52    Both BTS_SECUR
18ce0 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53  E_DELETE and BTS
18cf0 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20 63  _OVERWRITE are c
18d00 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
18d10 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54  Flag==1       BT
18d20 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18d30 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  set and BTS_OVER
18d40 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65 64  WRITE is cleared
18d50 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
18d60 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55  2       BTS_SECU
18d70 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65  RE_DELETE cleare
18d80 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  d and BTS_OVERWR
18d90 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  ITE is set.**   
18da0 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20   newFlag==(-1)  
18db0 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a    No changes.**.
18dc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18dd0 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79 20  acts as a query 
18de0 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65  if newFlag is le
18df0 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a  ss than zero.**.
18e00 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52  ** With BTS_OVER
18e10 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74  WRITE set, delet
18e20 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76  ed content is ov
18e30 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72  erwritten by zer
18e40 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c  os, but.** freel
18e50 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
18e60 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62  re not written b
18e70 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
18e80 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61  ase.  Thus in-pa
18e90 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f  ge.** deleted co
18ea0 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64  ntent is cleared
18eb0 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20 64  , but freelist d
18ec0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18ed0 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  s not..**.** Wit
18ee0 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
18ef0 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69  ETE, operation i
18f00 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57  s like BTS_OVERW
18f10 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61 64  RITE with the ad
18f20 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66  dition.** that f
18f30 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18f40 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 62  es are written b
18f50 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
18f60 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e  abase, increasin
18f70 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20  g.** the amount 
18f80 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a  of disk I/O..*/.
18f90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18fa0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
18fb0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
18fc0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
18fd0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
18fe0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
18ff0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
19000 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57  ssert( BTS_OVERW
19010 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45  RITE==BTS_SECURE
19020 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61  _DELETE*2 );.  a
19030 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f  ssert( BTS_FAST_
19040 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45  SECURE==(BTS_OVE
19050 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52  RWRITE|BTS_SECUR
19060 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69  E_DELETE) );.  i
19070 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
19080 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
19090 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41  Flags &= ~BTS_FA
190a0 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70  ST_SECURE;.    p
190b0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
190c0 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
190d0 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20  LETE*newFlag;.  
190e0 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d  }.  b = (p->pBt-
190f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
19100 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53  FAST_SECURE)/BTS
19110 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
19120 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19130 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19140 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
19150 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
19160 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
19170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
19180 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
19190 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
191a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
191b0 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
191c0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
191d0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
191e0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
191f0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
19200 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
19210 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
19220 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
19230 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
19240 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
19250 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
19260 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
19270 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
19280 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
19290 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
192a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
192b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
192c0 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
192d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
192e0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
192f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19300 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
19310 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
19320 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19330 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
19340 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
19350 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
19360 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
19370 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19380 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19390 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
193a0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
193b0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
193c0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
193d0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
193e0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
193f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19400 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
19410 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
19420 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
19430 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
19440 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
19450 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
19460 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
19470 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19480 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
19490 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
194a0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
194b0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
194c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
194d0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
194e0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
194f0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
19500 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19510 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
19520 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
19530 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
19540 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
19550 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
19560 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
19570 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
19580 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
19590 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
195a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
195b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
195c0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
195d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
195e0 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74  user has not set
195f0 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
19600 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  l for this datab
19610 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
19620 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  * using "PRAGMA 
19630 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e  synchronous", an
19640 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79 2d  d if the safety-
19650 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72  level is not alr
19660 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74  eady.** set to t
19670 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
19680 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
19690 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
196a0 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74  arameter,.** set
196b0 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53   it so..*/.#if S
196c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
196d0 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54  NCHRONOUS!=SQLIT
196e0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
196f0 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20  NCHRONOUS \.    
19700 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19710 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61  TE_OMIT_WAL).sta
19720 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61  tic void setDefa
19730 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68  ultSyncFlag(BtSh
19740 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61  ared *pBt, u8 sa
19750 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73  fety_level){.  s
19760 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
19770 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62   *pDb;.  if( (db
19780 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20  =pBt->db)!=0 && 
19790 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30  (pDb=db->aDb)!=0
197a0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
197b0 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44  Db->pBt==0 || pD
197c0 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74  b->pBt->pBt!=pBt
197d0 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20   ){ pDb++; }.   
197e0 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53   if( pDb->bSyncS
197f0 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  et==0 .     && p
19800 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
19810 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a  !=safety_level .
19820 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62       && pDb!=&db
19830 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b  ->aDb[1] .    ){
19840 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65  .      pDb->safe
19850 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74  ty_level = safet
19860 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73  y_level;.      s
19870 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
19880 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
19890 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
198a0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28  safety_level | (
198b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45  db->flags & PAGE
198c0 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a  R_FLAGS_MASK));.
198d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
198e0 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65  e.# define setDe
198f0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
19900 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a  t,safety_level).
19910 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
19920 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
19930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
19940 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
19950 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  d*);.../*.** Get
19960 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19970 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
19980 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
19990 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
199a0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
199b0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
199c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
199d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
199e0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
199f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
19a00 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
19a10 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
19a20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19a30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
19a40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
19a50 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
19a60 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
19a70 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
19a80 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
19a90 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
19aa0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
19ab0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
19ac0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
19ad0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19af0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
19b00 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
19b10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
19b20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
19b30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19b40 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
19b50 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
19b60 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19b70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19b80 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46   */.  u32 nPageF
19b90 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
19ba0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bc0 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
19bd0 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
19be0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19bf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19c00 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
19c10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
19c20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19c30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19c40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19c50 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
19c60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19c70 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
19c80 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
19c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
19cb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19cc0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
19cd0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19ce0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
19cf0 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
19d00 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
19d10 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
19d20 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
19d30 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
19d40 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
19d50 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
19d60 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
19d70 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
19d80 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
19d90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
19da0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
19db0 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50  Pager, (int*)&nP
19dc0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
19dd0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
19de0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
19df0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
19e00 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19e10 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
19e20 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
19e30 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e    }.  if( (pBt->
19e40 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19e50 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
19e60 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
19e70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
19e80 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
19e90 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
19ea0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
19eb0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
19ec0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
19ed0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19ee0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
19ef0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
19f00 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
19f10 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
19f20 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
19f30 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
19f40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
19f50 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
19f60 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
19f70 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
19f80 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
19f90 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
19fa0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
19fb0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
19fc0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
19fd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19fe0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
19ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1a000 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
1a010 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
1a020 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a030 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1a040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a050 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
1a060 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a070 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a080 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
1a090 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
1a0a0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1a0b0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
1a0c0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
1a0d0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
1a0e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1a0f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a110 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
1a120 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
1a130 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
1a140 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
1a150 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
1a160 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
1a170 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1a180 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
1a190 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
1a1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a1b0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
1a1c0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
1a1d0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
1a1e0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
1a1f0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
1a200 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
1a210 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
1a220 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
1a230 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
1a240 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
1a250 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
1a260 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
1a270 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
1a280 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
1a290 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
1a2a0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
1a2b0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
1a2c0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1a2d0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
1a2e0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1a2f0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
1a300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1a310 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
1a320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a330 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
1a340 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
1a350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a370 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a380 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3a0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
1a3b0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
1a3c0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1a3d0 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1a3e0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1a3f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a400 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1a410 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
1a420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a430 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1a440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1a450 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
1a460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a470 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1a480 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1a490 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1a4a0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
1a4b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
1a4c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
1a4d0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
1a4e0 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
1a4f0 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
1a500 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
1a510 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
1a520 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1a530 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1a540 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
1a550 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1a560 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
1a570 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
1a580 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
1a590 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
1a5a0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
1a5b0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
1a5c0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
1a5d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
1a5e0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
1a5f0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
1a600 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
1a610 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a620 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a630 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a640 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
1a650 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1a660 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a670 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1a680 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
1a690 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
1a6a0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
1a6b0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
1a6c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
1a6d0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
1a6e0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1a6f0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
1a700 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
1a710 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
1a720 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a730 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
1a740 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
1a750 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
1a760 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
1a770 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
1a780 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
1a790 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
1a7a0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
1a7b0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
1a7c0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
1a7d0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
1a7e0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
1a7f0 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
1a800 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a810 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1a820 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a830 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
1a840 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72  FIXED;.    asser
1a850 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
1a860 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
1a870 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
1a880 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
1a890 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
1a8a0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
1a8b0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
1a8c0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
1a8d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a8e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1a8f0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
1a900 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
1a910 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
1a920 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
1a930 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a940 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
1a950 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
1a960 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
1a970 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
1a980 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
1a990 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
1a9a0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
1a9b0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
1a9c0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1a9d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1a9e0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
1a9f0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
1aa00 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
1aa10 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
1aa20 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
1aa30 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
1aa40 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
1aa50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1aa60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1aa70 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
1aa80 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
1aa90 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
1aaa0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
1aab0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
1aac0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
1aad0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
1aae0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
1aaf0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1ab00 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1ab10 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1ab20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1ab30 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1ab40 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1ab50 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1ab60 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1ab70 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1ab80 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1ab90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1aba0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1abb0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1abc0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1abd0 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1abe0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1abf0 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1ac00 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1ac10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ac20 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1ac30 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1ac40 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1ac70 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1ac80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ac90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1aca0 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
1acb0 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d  Schema(pBt->db)=
1acc0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1acd0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1ace0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1acf0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1ad00 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1ad10 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1ad20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1ad30 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1ad40 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1ad50 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1ad60 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1ad70 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1ad80 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1ad90 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1ada0 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1adb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1adc0 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1add0 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1ade0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1adf0 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1ae00 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1ae10 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1ae20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1ae30 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1ae40 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1ae50 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1ae60 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1ae70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ae80 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1ae90 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1aea0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1aeb0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1aec0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1aed0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1aee0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1aef0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1af00 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1af10 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1af20 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1af30 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1af40 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1af50 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1af60 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1af70 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1af80 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1af90 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1afa0 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1afb0 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1afc0 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1afd0 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1afe0 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1aff0 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1b000 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1b010 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1b020 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1b030 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1b040 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1b050 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1b060 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1b070 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1b080 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1b090 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1b0a0 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1b0b0 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1b0c0 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1b0d0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1b0e0 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1b0f0 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1b100 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1b110 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1b120 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1b130 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1b140 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1b150 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1b160 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1b170 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1b180 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1b190 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1b1a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1b1b0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1b1c0 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1b1d0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1b1e0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1b1f0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1b200 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1b210 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1b220 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1b230 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1b240 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1b250 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1b260 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1b270 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1b280 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1b290 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1b2a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1b2b0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1b2c0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1b2d0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1b2e0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1b2f0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1b300 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b310 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1b320 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1b330 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1b340 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1b350 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1b360 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1b370 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1b380 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b390 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1b3a0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1b3b0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1b3c0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1b3d0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1b3e0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1b3f0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1b400 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1b410 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1b420 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1b430 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1b440 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1b450 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1b460 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1b470 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1b480 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1b490 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1b4a0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1b4b0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1b4c0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1b4d0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1b4e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1b4f0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1b500 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1b510 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1b520 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1b530 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1b540 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1b550 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1b560 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1b570 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1b580 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1b590 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1b5a0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1b5b0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1b5c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1b5d0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1b5e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1b5f0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1b600 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1b610 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1b620 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1b630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1b640 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1b650 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1b660 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1b670 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1b680 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1b690 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1b6a0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1b6b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1b6c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1b6d0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1b6e0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1b6f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1b700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1b710 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1b720 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1b730 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1b740 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1b750 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1b760 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1b770 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b780 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1b790 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1b7a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1b7b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1b7c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b7d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1b7e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1b7f0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1b800 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1b810 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1b820 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1b830 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1b840 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b850 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1b860 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1b870 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1b880 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1b890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b8a0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1b8b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b8c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1b8d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1b8e0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1b8f0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1b900 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1b910 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1b920 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1b930 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1b940 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1b950 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1b960 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1b970 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1b980 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1b990 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1b9a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1b9b0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1b9c0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1b9d0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1b9e0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1b9f0 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1ba00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ba10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ba20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1ba30 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1ba40 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1ba50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ba60 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1ba70 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1ba80 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1ba90 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1baa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1bab0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1bac0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1bad0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1bae0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1baf0 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1bb00 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1bb10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1bb20 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1bb30 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1bb40 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1bb50 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1bb60 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1bb70 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1bb80 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1bb90 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1bba0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1bbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1bbc0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1bbd0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1bbe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1bbf0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1bc00 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1bc10 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1bc20 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1bc30 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1bc40 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1bc50 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1bc60 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1bc70 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1bc80 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1bc90 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1bca0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1bcb0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1bcc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1bcd0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1bce0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1bcf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1bd00 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1bd10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1bd20 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1bd30 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1bd40 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1bd50 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1bd60 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1bd70 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1bd80 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1bd90 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1bda0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1bdb0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1bdc0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1bdd0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1bde0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1bdf0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1be00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1be10 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1be20 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1be30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1be40 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1be50 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1be60 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1be70 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1be80 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1be90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1bea0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1beb0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1bec0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1bed0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1bee0 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1bef0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1bf00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1bf10 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1bf20 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1bf30 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1bf40 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1bf50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bf60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bf70 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1bf80 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1bf90 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1bfa0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1bfb0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1bfc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1bfd0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1bfe0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1bff0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1c000 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1c010 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1c020 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1c030 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1c040 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1c050 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1c060 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1c070 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1c080 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1c090 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1c0a0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1c0b0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1c0c0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1c0d0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1c0e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1c0f0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1c100 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1c110 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1c120 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1c130 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1c140 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1c150 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1c160 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1c170 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1c180 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1c190 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1c1a0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1c1b0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1c1c0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1c1d0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1c1e0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1c1f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c200 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1c210 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c220 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1c230 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c240 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1c250 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c260 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1c270 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c280 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1c290 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c2a0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1c2b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1c2c0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1c2d0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1c2e0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1c2f0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1c300 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1c310 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1c320 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1c330 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1c340 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1c350 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1c360 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1c370 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1c380 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1c390 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1c3a0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1c3b0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1c3c0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1c3d0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1c3e0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1c3f0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1c400 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1c410 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1c420 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1c430 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1c440 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1c450 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1c460 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1c470 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1c480 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1c490 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1c4a0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1c4b0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1c4c0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1c4d0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1c4e0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1c4f0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1c500 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1c510 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1c520 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1c530 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1c540 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1c550 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1c560 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1c570 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1c580 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1c590 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1c5a0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1c5b0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1c5c0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1c5d0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1c5e0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1c5f0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1c600 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1c610 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1c620 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1c630 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a  nt wrflag, int *
1c640 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b  pSchemaVersion){
1c650 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c660 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1c670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c680 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1c690 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1c6a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1c6b0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1c6c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1c6d0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1c6e0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1c6f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1c700 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1c710 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1c720 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1c730 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1c740 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1c750 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1c760 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1c770 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1c780 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1c790 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1c7a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1c7b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1c7c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c7d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1c7e0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1c7f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1c800 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64   );..  if( (p->d
1c810 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1c820 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29  E_ResetDatabase)
1c830 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
1c840 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
1c850 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a  Bt->pPager)==0 .
1c860 20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74    ){.    pBt->bt
1c870 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52  sFlags &= ~BTS_R
1c880 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  EAD_ONLY;.  }.. 
1c890 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1c8a0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1c8b0 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1c8c0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1c8d0 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1c8e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1c8f0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1c900 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1c910 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1c920 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1c930 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1c940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c950 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c960 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1c970 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1c980 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1c990 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1c9a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1c9b0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1c9c0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1c9d0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1c9e0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1c9f0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1ca00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1ca10 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1ca20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1ca30 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1ca40 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1ca50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ca60 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1ca70 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1ca80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1ca90 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1caa0 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1cab0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1cac0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cad0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1cae0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1caf0 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1cb00 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1cb10 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1cb20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1cb30 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1cb40 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1cb50 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1cb60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1cb70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1cb80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1cba0 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1cbb0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1cbc0 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1cbd0 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1cbe0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1cbf0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1cc00 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1cc10 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1cc20 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1cc30 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1cc40 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1cc50 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1cc60 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1cc70 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1cc80 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1cc90 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1cca0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1ccb0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1ccc0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1ccd0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1cce0 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1ccf0 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1cd00 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1cd10 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1cd20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1cd30 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1cd40 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1cd50 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1cd60 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1cd70 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1cd80 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1cd90 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1cda0 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1cdb0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1cdc0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1cdd0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1cde0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1cdf0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1ce00 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1ce10 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1ce20 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1ce30 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1ce40 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1ce50 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1ce60 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1ce70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1ce80 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1ce90 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1cea0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1ceb0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1cec0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ced0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1cee0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1cef0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1cf00 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1cf10 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1cf20 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1cf30 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1cf40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1cf50 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1cf60 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1cf70 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1cf80 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1cf90 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1cfa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cfb0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1cfc0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1cfd0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1cfe0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1cff0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d000 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1d010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d030 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1d040 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1d050 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1d060 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1d070 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d090 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1d0a0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1d0b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1d0c0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  ==SQLITE_BUSY_SN
1d0d0 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69  APSHOT && pBt->i
1d0e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d0f0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1d100 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72        /* if ther
1d110 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63  e was no transac
1d120 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e  tion opened when
1d130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1d140 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1d150 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54  called and SQLIT
1d160 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
1d170 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61  is returned, cha
1d180 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20  nge the error.  
1d190 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20          ** code 
1d1a0 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  to SQLITE_BUSY. 
1d1b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1d1c0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d1e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1d1f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d200 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1d210 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1d230 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1d240 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1d250 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d260 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1d270 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1d280 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1d290 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  pBt) );.  sqlite
1d2a0 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54  3PagerResetLockT
1d2b0 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67  imeout(pBt->pPag
1d2c0 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  er);..  if( rc==
1d2d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1d2f0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1d300 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1d310 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1d320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1d330 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1d340 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1d350 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d360 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1d370 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1d380 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1d390 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1d3a0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1d3b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1d3c0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1d3d0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1d3e0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1d3f0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1d400 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1d410 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1d420 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1d430 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1d440 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1d450 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1d460 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1d470 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1d480 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1d490 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1d4a0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1d4b0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1d4c0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1d4d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1d4e0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1d4f0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1d500 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1d510 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1d520 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1d530 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1d540 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1d550 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1d560 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1d570 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1d580 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1d590 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1d5a0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1d5b0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1d5c0 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1d5d0 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1d5e0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1d5f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d600 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1d610 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1d620 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1d630 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1d640 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1d650 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1d660 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1d670 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1d680 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1d690 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1d6a0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1d6b0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1d6c0 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1d6d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1d6e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d6f0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1d700 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1d710 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1d720 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d730 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d740 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1d750 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1d760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d770 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d780 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d790 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1d7a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d7b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74    }.    }.  }..t
1d7c0 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1d7d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d7e0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  ){.    if( pSche
1d7f0 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  maVersion ){.   
1d800 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69     *pSchemaVersi
1d810 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  on = get4byte(&p
1d820 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1d830 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  a[40]);.    }.  
1d840 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1d850 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1d860 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1d870 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1d880 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1d890 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
1d8a0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1d8b0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1d8c0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1d8d0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1d8e0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d       ** the sub-
1d8f0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1d900 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1d910 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1d920 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ned here..      
1d930 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1d940 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1d950 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1d960 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
1d970 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
1d980 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1d990 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1d9a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1d9b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d9c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d9d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d9e0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1d9f0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1da00 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1da10 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1da20 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1da30 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1da40 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1da50 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1da60 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1da70 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1da80 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1da90 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1daa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1dab0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1dac0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1dad0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1db00 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1db10 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1db40 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1db50 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1db80 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1db90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1dba0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
1dbb0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1dbc0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1dbd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dbe0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1dbf0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1dc00 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1dc10 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1dc20 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1dc30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1dc40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1dc50 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  c;.  nCell = pPa
1dc60 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1dc70 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1dc80 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1dc90 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1dca0 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1dcb0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1dcc0 70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70 43  pPage, pPage, pC
1dcd0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1dce0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1dcf0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1dd00 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1dd10 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1dd20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1dd30 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1dd40 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1dd50 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1dd60 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1dd70 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1dd80 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1dd90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1dda0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1ddb0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1ddc0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1ddd0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1dde0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1ddf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1de00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1de10 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1de20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1de30 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1de40 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1de50 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1de60 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1de70 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1de80 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1de90 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1dea0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1deb0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1dec0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1ded0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1dee0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1def0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1df00 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1df20 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1df30 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1df40 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1df50 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1df60 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1df70 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1dfa0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1dfb0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1dfc0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1dfd0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1dfe0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1dff0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1e000 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1e010 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1e020 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1e030 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1e040 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e050 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1e060 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1e070 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1e080 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1e090 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1e0a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e0b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1e0c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1e0d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1e0e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1e0f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1e100 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e110 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1e120 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1e130 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1e140 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1e150 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1e160 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1e170 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1e180 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1e190 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e1a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1e1b0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
1e1c0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
1e1d0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
1e1e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e1f0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1e200 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1e210 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ;..    rc = pPag
1e220 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49  e->isInit ? SQLI
1e230 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69  TE_OK : btreeIni
1e240 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1e250 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e260 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1e270 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1e280 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e290 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1e2a0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1e2b0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1e2c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1e2d0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1e2e0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1e2f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1e300 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1e310 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1e320 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1e330 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1e340 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1e350 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
1e360 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
1e370 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e  .nSize > pPage->
1e380 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74  aData+pPage->pBt
1e390 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1e3b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e3c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1e3d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e3e0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
1e3f0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1e400 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a  nfo.nSize-4) ){.
1e410 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1e420 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1e430 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1e440 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e450 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1e470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1e480 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1e490 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1e4a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1e4b0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1e4c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e4e0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1e4f0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1e500 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1e510 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1e520 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1e530 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1e540 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1e550 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1e560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e570 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1e580 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
1e590 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e5a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1e5b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1e5c0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1e5d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e5e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1e5f0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1e600 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1e610 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1e620 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1e630 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1e640 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1e650 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1e660 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1e670 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1e680 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1e690 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1e6a0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1e6b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1e6c0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1e6d0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1e6e0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1e6f0 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1e700 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1e710 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e720 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1e730 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1e740 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1e750 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1e760 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1e770 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1e780 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1e790 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1e7a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1e7b0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1e7c0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1e7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1e7e0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1e7f0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1e800 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1e810 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1e820 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1e830 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1e840 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1e850 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1e860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e870 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1e880 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1e890 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1e8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1e8b0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1e8c0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1e8d0 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1e8e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1e8f0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1e900 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1e910 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1e920 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1e930 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1e940 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1e950 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1e960 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1e970 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1e980 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1e990 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1e9a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1e9b0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1e9c0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1e9d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1e9e0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1e9f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ea00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1ea10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1ea20 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1ea30 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50  Bt );.  if( iDbP
1ea40 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53  age<3 ) return S
1ea50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea60 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70  PT;..  /* Move p
1ea70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1ea80 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1ea90 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1eaa0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1eab0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1eac0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1ead0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1eae0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1eaf0 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1eb00 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1eb10 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1eb20 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1eb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1eb40 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1eb50 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1eb60 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1eb70 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1eb80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1eba0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1ebb0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1ebc0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1ebd0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1ebe0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1ebf0 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1ec00 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1ec10 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1ec20 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1ec30 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1ec40 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1ec50 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1ec60 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1ec70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1ec80 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1ec90 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1eca0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1ecb0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1ecc0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1ecd0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1ece0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1ecf0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1ed00 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1ed10 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1ed20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1ed30 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1ed40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1ed50 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1ed60 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1ed70 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1ed80 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1ed90 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1eda0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1edb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1edc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1edd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ede0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1edf0 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1ee00 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1ee10 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1ee20 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1ee30 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1ee40 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1ee50 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1ee60 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1ee70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ee80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ee90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1eea0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1eeb0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1eec0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1eed0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1eee0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1eef0 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1ef00 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1ef10 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1ef20 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1ef30 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1ef40 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1ef50 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1ef60 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1ef70 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1ef80 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1ef90 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1efa0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1efb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1efc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1efd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1efe0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1eff0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1f000 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f020 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f030 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1f040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f050 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1f060 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1f070 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1f080 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1f090 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1f0a0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1f0b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1f0d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1f0e0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1f0f0 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1f100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f110 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1f120 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1f130 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1f140 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1f150 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1f160 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1f170 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1f180 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1f190 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1f1a0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1f1b0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1f1c0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1f1d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1f1e0 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1f1f0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1f200 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1f210 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1f220 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1f230 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1f240 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1f250 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1f260 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1f270 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1f280 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1f290 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1f2a0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1f2b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f2c0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1f2d0 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1f2e0 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1f2f0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1f300 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1f310 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1f320 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1f330 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1f340 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1f350 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1f360 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1f370 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1f380 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1f390 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1f3a0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1f3b0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1f3c0 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1f3d0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1f3e0 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1f3f0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1f400 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1f410 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1f420 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f430 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1f440 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1f450 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1f460 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1f470 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1f480 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1f490 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1f4a0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1f4b0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1f4c0 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1f4d0 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1f4e0 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1f4f0 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1f500 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1f510 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1f520 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1f530 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f540 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1f550 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1f560 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1f570 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f580 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1f590 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f5a0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1f5b0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1f5c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1f5d0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1f5e0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1f5f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1f600 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1f610 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1f620 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1f630 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f640 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f650 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1f660 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1f670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1f680 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1f690 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1f6a0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1f6b0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1f6c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f6d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f6e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f6f0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1f700 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1f710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f720 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f730 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1f740 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1f750 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1f760 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1f770 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1f780 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1f790 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1f7a0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1f7b0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1f7c0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1f7d0 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1f7e0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1f7f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1f800 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1f810 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1f820 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1f830 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1f840 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1f850 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1f860 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1f870 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1f880 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1f890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f8a0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1f8b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1f8c0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1f8d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1f8e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1f8f0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1f900 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1f910 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1f920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1f960 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1f970 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1f980 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1f990 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1f9a0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1f9b0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f9d0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1f9e0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1f9f0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1fa00 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1fa10 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1fa20 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1fa30 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1fa40 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1fa50 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1fa60 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1fa70 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1fa80 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1fa90 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1faa0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1fab0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1fac0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1fad0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1fae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1faf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fb10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1fb20 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1fb30 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1fb40 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1fb50 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1fb60 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1fb70 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1fb80 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1fb90 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1fba0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1fbb0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1fbc0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1fbd0 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1fbe0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1fbf0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1fc00 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1fc10 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1fc20 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1fc30 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1fc40 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1fc50 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1fc60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fc70 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1fc80 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1fc90 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1fca0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1fcb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fcc0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1fcd0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1fce0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1fcf0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1fd00 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1fd10 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1fd20 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1fd30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fd40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1fd50 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1fd60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1fd70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1fd80 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1fd90 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1fda0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1fdb0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1fdc0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1fdd0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1fde0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1fdf0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1fe00 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1fe10 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1fe20 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1fe30 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1fe40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1fe50 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1fe60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fe70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fe80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1fe90 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1fea0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1feb0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1fec0 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1fed0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1fee0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1fef0 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1ff00 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1ff10 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1ff20 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1ff30 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1ff40 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1ff50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ff60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1ff70 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1ff80 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1ff90 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1ffa0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1ffb0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1ffc0 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1ffd0 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1ffe0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1fff0 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
20000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20010 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
20020 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
20030 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
20040 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
20050 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
20060 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
20070 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
20080 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
200b0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
200c0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
200d0 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200f0 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
20100 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
20110 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
20120 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20140 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
20150 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
20160 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
20170 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
20180 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
20190 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
201a0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
201b0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
201c0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
201d0 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
201e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
201f0 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
20200 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
20210 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
20220 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
20230 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20240 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
20250 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20260 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
20270 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
20280 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
20290 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
202a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
202b0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
202c0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
202d0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
202e0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
202f0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
20300 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
20310 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
20320 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
20330 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
20340 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
20350 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
20360 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
20370 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
20380 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
20390 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
203a0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
203b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
203c0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
203d0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
203e0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
203f0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
20400 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
20410 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
20420 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20430 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
20440 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
20450 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
20460 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
20470 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
20480 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20490 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
204a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
204b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
204c0 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
204d0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
204e0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
204f0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
20500 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
20510 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20520 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
20530 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
20540 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
20550 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
20560 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
20570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20580 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20590 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
205a0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
205b0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
205c0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
205d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
205e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
205f0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
20600 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
20610 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
20620 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
20630 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
20640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
20670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20680 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
20690 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
206a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
206b0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
206c0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
206d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
206e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
206f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
20700 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
20710 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
20720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20730 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
20740 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
20750 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
20760 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
20770 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
20780 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
20790 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
207a0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
207b0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
207c0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
207d0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
207e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
207f0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
20800 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
20810 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
20820 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
20830 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
20840 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
20850 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
20860 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
20870 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
20880 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
20890 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
208a0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
208b0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
208c0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
208d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
208e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
208f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
20900 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
20910 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
20920 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20930 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
20940 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20950 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
20960 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
20970 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
20980 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
20990 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
209a0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
209b0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
209c0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
209d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
209e0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
209f0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
20a00 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
20a10 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
20a20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
20a30 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
20a40 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
20a50 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
20a60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
20a70 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
20a80 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
20a90 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
20aa0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
20ab0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
20ac0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
20ad0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
20ae0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
20af0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
20b00 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
20b10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20b20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
20b30 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
20b40 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
20b50 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
20b60 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
20b70 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
20b80 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
20b90 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
20ba0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
20bb0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
20bc0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
20bd0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
20be0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
20bf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
20c00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20c10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
20c20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
20c30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20c40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
20c50 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
20c60 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
20c70 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
20c80 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
20c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20ca0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
20cb0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
20cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
20cd0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
20ce0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
20cf0 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
20d00 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
20d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
20d20 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
20d30 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
20d40 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
20d50 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
20d60 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
20d70 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
20d80 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
20d90 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
20da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20db0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
20dc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20dd0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20de0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
20df0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
20e00 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20e10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
20e20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
20e30 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20e40 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
20e50 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
20e60 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
20e70 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
20e80 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
20e90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
20eb0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20ec0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
20ed0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20ee0 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
20ef0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
20f00 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
20f10 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
20f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20f30 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
20f40 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
20f50 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
20f60 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
20f70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20f80 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
20f90 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
20fa0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
20fb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
20fc0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
20fd0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
20fe0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
20ff0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
21000 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
21010 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
21020 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
21030 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
21040 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
21050 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
21060 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
21070 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
21080 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
21090 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
210a0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
210b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
210c0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
210d0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
210e0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
210f0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
21100 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
21110 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
21120 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
21130 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
21140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
21150 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
21160 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
21170 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
21180 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
21190 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
211a0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
211b0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
211c0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
211d0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
211e0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
211f0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
21200 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
21210 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
21220 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
21230 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
21240 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
21250 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
21260 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
21270 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21280 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
21290 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
212a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
212b0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
212c0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
212d0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
212e0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
212f0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
21300 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
21310 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
21320 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
21330 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
21340 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
21350 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
21360 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
21370 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
21380 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
21390 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
213a0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
213b0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
213c0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
213d0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
213e0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
213f0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
21400 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
21410 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
21420 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
21430 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
21440 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
21450 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
21460 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
21470 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
21480 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
21490 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
214a0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
214b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
214c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
214d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
214e0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
214f0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
21500 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21510 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
21520 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21530 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
21540 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21560 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
21570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21580 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
21590 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
215a0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
215b0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
215c0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
215d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
215e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
215f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21600 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21610 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21620 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
21630 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
21640 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21650 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
21660 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
21670 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
21680 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
21690 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
216a0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
216b0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
216c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
216d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
216e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
216f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21700 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
21710 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
21720 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
21730 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
21740 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
21750 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
21760 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
21770 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
21780 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
21790 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
217a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
217b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
217c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
217d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
217e0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
217f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21800 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21810 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
21820 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
21830 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
21840 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
21850 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
21860 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
21870 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
21880 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
21890 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
218a0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
218b0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
218c0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
218d0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
218e0 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
218f0 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
21900 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
21910 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21920 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
21930 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
21940 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
21950 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21960 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21970 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
21980 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
21990 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
219a0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
219b0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
219c0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
219d0 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
219e0 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
219f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21a00 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
21a10 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
21a20 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
21a30 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
21a40 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
21a50 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
21a60 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
21a70 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
21a80 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
21a90 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
21aa0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
21ab0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
21ac0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
21ad0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
21ae0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
21af0 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
21b00 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
21b10 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21b20 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
21b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21b40 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
21b50 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
21b60 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
21b70 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
21b80 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
21b90 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
21ba0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
21bb0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
21bc0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
21bd0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21be0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21bf0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
21c00 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
21c10 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21c20 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
21c30 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
21c40 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
21c50 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
21c60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21c70 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
21c80 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
21c90 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
21ca0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
21cb0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21cc0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
21cd0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
21ce0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
21cf0 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
21d00 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
21d10 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
21d20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21d30 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
21d40 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
21d50 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
21d60 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
21d70 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
21d80 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
21d90 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
21da0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
21db0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
21dc0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
21dd0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
21de0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
21df0 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
21e00 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
21e10 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
21e20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
21e30 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
21e40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
21e50 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
21e60 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
21e70 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
21e80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21e90 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
21ea0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
21eb0 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
21ec0 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
21ed0 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
21ee0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
21ef0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
21f00 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
21f10 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
21f20 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
21f30 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
21f40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
21f50 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
21f60 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
21f70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
21f80 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
21f90 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
21fa0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
21fb0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
21fc0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
21fd0 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
21fe0 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
21ff0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
22000 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
22010 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
22020 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
22030 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
22040 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
22050 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
22060 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
22070 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
22080 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
22090 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
220a0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
220b0 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
220c0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
220d0 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
220e0 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
220f0 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
22100 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
22110 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
22120 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
22130 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
22140 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
22150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22160 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
22170 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
22180 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
22190 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
221a0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
221b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
221c0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
221d0 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
221e0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
221f0 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
22200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22210 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
22220 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
22230 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
22240 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
22250 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
22260 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
22270 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
22280 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
22290 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
222a0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
222b0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
222c0 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
222d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
222e0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
222f0 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
22300 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22310 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
22320 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22330 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
22340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
22350 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
22360 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
22370 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
22380 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
22390 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
223a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
223b0 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
223c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
223d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
223e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
223f0 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
22400 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
22410 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
22420 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
22430 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
22440 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
22450 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
22460 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
22470 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
22480 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
22490 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
224a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
224b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
224c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
224d0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
224e0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
224f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
22500 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
22510 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
22520 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22530 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22540 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22550 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
22560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22570 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
22580 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
22590 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
225a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
225b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
225c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
225d0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
225e0 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
225f0 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
22600 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
22610 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
22620 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
22630 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
22640 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
22650 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
22660 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
22670 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
22680 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
22690 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
226a0 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
226b0 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
226c0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
226d0 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
226e0 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
226f0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
22700 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
22710 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
22720 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
22730 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
22740 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
22750 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
22760 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
22770 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
22780 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
22790 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
227a0 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
227b0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
227c0 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
227d0 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
227e0 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
227f0 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
22800 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
22810 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
22820 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
22830 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
22840 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
22850 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
22860 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
22870 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
22880 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
22890 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
228a0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
228b0 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
228c0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
228d0 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
228e0 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
228f0 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
22900 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
22910 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
22920 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
22930 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
22940 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
22950 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
22960 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
22970 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
22980 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
22990 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
229a0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
229b0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
229c0 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
229d0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
229e0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
229f0 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
22a00 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
22a10 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
22a20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
22a30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
22a40 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
22a50 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
22a60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
22a70 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
22a80 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
22a90 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
22aa0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
22ab0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
22ac0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
22ad0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
22ae0 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
22af0 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
22b00 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
22b10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
22b20 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
22b30 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
22b40 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
22b50 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
22b60 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
22b70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22b80 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
22b90 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
22ba0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
22bb0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
22bc0 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26   if( writeOnly &
22bd0 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  & (p->curFlags &
22be0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
22bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
22c00 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
22c10 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
22c20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22c30 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
22c40 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
22c50 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
22c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
22c90 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
22ca0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
22cb0 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
22cc0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22cd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
22cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
22d00 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
22d10 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
22d20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
22d30 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
22d40 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
22d50 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
22d60 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65  .      btreeRele
22d70 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
22d80 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s(p);.    }.    
22d90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22da0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
22db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22dc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 42 74  *.** Set the pBt
22dd0 2d 3e 6e 50 61 67 65 20 66 69 65 6c 64 20 63 6f  ->nPage field co
22de0 72 72 65 63 74 6c 79 2c 20 61 63 63 6f 72 64 69  rrectly, accordi
22df0 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
22e00 74 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 74 68  t.** state of th
22e10 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 73 73  e database.  Ass
22e20 75 6d 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ume pBt->pPage1 
22e30 69 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  is valid..*/.sta
22e40 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 53 65  tic void btreeSe
22e50 74 4e 50 61 67 65 28 42 74 53 68 61 72 65 64 20  tNPage(BtShared 
22e60 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
22e70 50 61 67 65 31 29 7b 0a 20 20 69 6e 74 20 6e 50  Page1){.  int nP
22e80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
22e90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
22ea0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
22eb0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nPage==0 );.  if
22ec0 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
22ed0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
22ee0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
22ef0 26 6e 50 61 67 65 29 3b 0a 20 20 74 65 73 74 63  &nPage);.  testc
22f00 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
22f10 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70 42 74 2d  =nPage );.  pBt-
22f20 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
22f30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
22f40 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
22f50 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
22f60 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
22f70 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
22f80 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
22f90 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
22fa0 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
22fb0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
22fc0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
22fd0 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
22fe0 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
22ff0 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
23000 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
23010 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
23020 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
23030 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
23040 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
23050 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
23060 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
23070 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
23080 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
23090 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
230a0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
230b0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
230c0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
230d0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
230e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
230f0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
23100 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
23110 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
23120 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
23130 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23140 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23150 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
23160 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
23170 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
23180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
23190 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
231a0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
231b0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
231c0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
231d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
231e0 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
231f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23200 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
23210 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
23220 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
23230 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
23240 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
23250 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23260 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
23270 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
23280 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
23290 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
232a0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
232b0 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
232c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
232d0 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
232e0 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
232f0 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
23300 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
23310 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
23320 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
23330 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
23340 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23350 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
23360 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
23370 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
23380 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
23390 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
233a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
233b0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
233c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
233d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
233e0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
233f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
23400 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
23410 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
23420 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
23430 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
23440 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
23450 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
23460 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
23470 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
23480 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
23490 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
234a0 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
234b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
234c0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
234d0 29 7b 0a 20 20 20 20 20 20 62 74 72 65 65 53 65  ){.      btreeSe
234e0 74 4e 50 61 67 65 28 70 42 74 2c 20 70 50 61 67  tNPage(pBt, pPag
234f0 65 31 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  e1);.      relea
23500 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
23510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
23520 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
23530 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
23540 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
23550 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
23560 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
23570 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
23580 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
23590 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
235a0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
235b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
235c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
235d0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
235e0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
235f0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
23600 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
23610 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
23620 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
23630 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
23640 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
23650 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
23660 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
23670 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
23680 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
23690 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
236a0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
236b0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
236c0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
236d0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
236e0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
236f0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
23700 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
23710 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
23720 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
23730 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
23740 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
23750 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
23760 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
23770 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
23780 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
23790 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
237a0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
237b0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
237c0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
237d0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
237e0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
237f0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
23800 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
23810 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
23820 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
23830 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
23840 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
23850 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
23860 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23870 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
23880 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
23890 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
238a0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
238b0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
238c0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
238d0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
238e0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
238f0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
23900 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
23910 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
23920 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
23930 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
23940 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
23950 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
23960 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
23970 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
23980 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
23990 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
239a0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
239b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
239c0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
239d0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
239e0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
239f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23a00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
23a10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23a20 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
23a30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
23a40 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
23a50 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
23a60 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
23a70 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
23a80 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
23a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23aa0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
23ab0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
23ac0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
23ad0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
23ae0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
23af0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
23b00 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
23b10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
23b20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
23b30 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
23b40 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
23b50 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
23b60 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
23b70 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
23b80 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
23b90 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
23ba0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
23bb0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
23bc0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
23bd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
23be0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
23bf0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
23c00 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
23c10 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
23c20 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
23c30 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
23c40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23c50 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
23c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23c70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23c80 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
23c90 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
23ca0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
23cb0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
23cc0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
23cd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
23ce0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
23cf0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
23d00 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
23d10 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
23d20 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
23d30 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
23d40 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
23d50 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23d60 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
23d70 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
23d80 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
23d90 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
23da0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
23db0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
23dc0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
23dd0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
23de0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
23df0 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
23e00 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
23e10 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
23e20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
23e30 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
23e40 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
23e50 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
23e60 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
23e70 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
23e80 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
23e90 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
23ea0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
23eb0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
23ec0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
23ed0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
23ee0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23ef0 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
23f00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23f10 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
23f20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
23f30 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
23f40 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23f50 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
23f60 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
23f70 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
23f80 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
23f90 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
23fa0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23fb0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
23fc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23fd0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
23fe0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23ff0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
24000 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
24010 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
24020 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24050 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
24060 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
24070 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
24080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
240a0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
240b0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
240c0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
240d0 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
240e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
240f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
24100 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
24110 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
24120 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 70   btreeSetNPage(p
24130 42 74 2c 20 70 42 74 2d 3e 70 50 61 67 65 31 29  Bt, pBt->pPage1)
24140 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 42 74 2d  ;..      /* pBt-
24150 3e 6e 50 61 67 65 20 6d 69 67 68 74 20 62 65 20  >nPage might be 
24160 7a 65 72 6f 20 69 66 20 74 68 65 20 64 61 74 61  zero if the data
24170 62 61 73 65 20 77 61 73 20 63 6f 72 72 75 70 74  base was corrupt
24180 20 77 68 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   when .      ** 
24190 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
241a0 77 61 73 20 73 74 61 72 74 65 64 2e 20 4f 74 68  was started. Oth
241b0 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20  erwise, it must 
241c0 62 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 20  be at least 1.  
241d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
241e0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
241f0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
24200 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24210 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24220 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24230 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
24240 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
24250 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
24260 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
24270 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
24280 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
24290 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
242a0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
242b0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
242c0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
242d0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
242e0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
242f0 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
24300 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
24310 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
24320 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
24330 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
24340 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
24350 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
24360 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
24370 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
24380 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
24390 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c   of wrFlag is cl
243a0 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ear, then the cu
243b0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a  rsor can only.**
243c0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
243d0 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54  ding.  If the BT
243e0 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73  REE_WRCSR bit is
243f0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63   set, then the c
24400 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20  ursor.** can be 
24410 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
24420 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20   or for writing 
24430 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
24440 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ons for writing.
24450 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ** are also met.
24460 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20    These are the 
24470 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
24480 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
24490 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74  rder.** for writ
244a0 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65  ing to be allowe
244b0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
244c0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
244d0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
244e0 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69  th wrFlag contai
244f0 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52  ning BTREE_WRCSR
24500 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
24510 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24520 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
24530 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
24540 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
24550 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
24560 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
24570 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
24580 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
24590 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
245a0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
245b0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
245c0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
245d0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
245e0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
245f0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
24600 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
24610 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
24620 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
24630 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24640 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
24650 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
24660 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
24670 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
24680 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
24690 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
246a0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
246b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
246c0 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
246d0 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61  bit of wrFlag ma
246e0 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20  y optionally be 
246f0 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43  set if BTREE_WRC
24700 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49  SR.** is set.  I
24710 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73  f FORDELETE is s
24720 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69  et, that is a hi
24730 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
24740 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
24750 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c   this cursor wil
24760 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74  l only be used t
24770 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65  o seek to and de
24780 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20  lete entries of 
24790 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70  an index.** as p
247a0 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
247b0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
247c0 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45  .  The FORDELETE
247d0 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65   hint is not use
247e0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70  d by.** this imp
247f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75  lementation.  Bu
24800 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69  t in a hypotheti
24810 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20  cal alternative 
24820 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a  storage engine .
24830 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65  ** in which inde
24840 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75  x entries are au
24850 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
24860 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70  ted when corresp
24870 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20  onding table.** 
24880 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64  rows are deleted
24890 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20  , the FORDELETE 
248a0 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74  flag is a hint t
248b0 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64  hat all SEEK and
248c0 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61   DELETE.** opera
248d0 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75  tions on this cu
248e0 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f  rsor can be no-o
248f0 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20  ps and all READ 
24900 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a  operations can .
24910 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c  ** return a null
24920 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30   row (2-bytes: 0
24930 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a  x01 0x00)..**.**
24940 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
24950 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
24960 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
24970 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
24980 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
24990 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
249a0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
249b0 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
249c0 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
249d0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
249e0 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
249f0 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
24a00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
24a10 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  ro() has been ca
24a20 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20  lled.** on pCur 
24a30 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
24a40 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70  e memory space p
24a50 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
24a60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
24a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
24a80 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
24a90 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
24ac0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24af0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
24b00 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
24b10 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
24b40 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
24b50 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
24b60 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b80 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
24b90 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
24ba0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
24bb0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24bd0 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
24be0 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  rsor */.){.  BtS
24bf0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
24c00 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
24c10 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d      /* Shared b-
24c20 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tree handle */. 
24c30 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20   BtCursor *pX;  
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69          /* Loopi
24c60 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c  ng over other al
24c70 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20  l cursors */..  
24c80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
24c90 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
24ca0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
24cb0 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20  rFlag==0 .      
24cc0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45   || wrFlag==BTRE
24cd0 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20  E_WRCSR .       
24ce0 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45  || wrFlag==(BTRE
24cf0 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f  E_WRCSR|BTREE_FO
24d00 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a  RDELETE) .  );..
24d10 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
24d20 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
24d30 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
24d40 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
24d50 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
24d60 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
24d70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
24d80 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
24d90 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
24da0 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
24db0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
24dc0 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
24dd0 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
24de0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
24df0 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
24e00 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
24e10 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
24e20 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
24e30 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46  KeyInfo!=0, (wrF
24e40 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61  lag?2:1)) );.  a
24e50 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24e60 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
24e70 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
24e80 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
24e90 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
24ea0 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
24eb0 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
24ec0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
24ed0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
24ee0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
24ef0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24f00 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
24f10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
24f20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
24f30 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
24f40 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  e1->aData );.  a
24f50 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24f60 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
24f70 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
24f80 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  LY)==0 );..  if(
24f90 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
24fa0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
24fb0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
24fc0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
24fd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24fe0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
24ff0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
25000 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
25010 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
25020 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
25030 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
25040 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
25050 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
25060 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
25070 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
25080 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
25090 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
250a0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
250b0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
250c0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
250d0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
250e0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
250f0 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
25100 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
25110 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
25120 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
25130 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
25140 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
25150 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77  ur->curFlags = w
25160 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69  rFlag ? BTCF_Wri
25170 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43  teFlag : 0;.  pC
25180 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
25190 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a  s = wrFlag ? 0 :
251a0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
251b0 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  NLY;.  /* If the
251c0 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
251d0 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  re cursors on th
251e0 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68  e same btree, th
251f0 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a  en all such.  **
25200 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20   cursors *must* 
25210 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75  have the BTCF_Mu
25220 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
25230 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74   */.  for(pX=pBt
25240 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70  ->pCursor; pX; p
25250 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25260 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f    if( pX->pgnoRo
25270 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65  ot==(Pgno)iTable
25280 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75   ){.      pX->cu
25290 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
252a0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70  ultiple;.      p
252b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
252c0 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
252d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
252e0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
252f0 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70  Cursor;.  pBt->p
25300 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
25310 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
25320 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
25330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25340 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
25350 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
25360 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25390 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
253a0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
253d0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
253e0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
253f0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
25420 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
25430 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
25440 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
25450 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
25460 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
25470 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
25480 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
25490 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
254c0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
254d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
254e0 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20  iTable<1 ){.    
254f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25500 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
25510 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e{.    sqlite3Bt
25520 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
25530 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
25540 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
25550 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
25560 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cur);.    sqlite
25570 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
25580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
255a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
255b0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
255c0 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
255d0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
255e0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
255f0 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
25600 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
25610 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
25620 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
25630 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
25640 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
25650 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
25660 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
25670 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
25680 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
25690 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
256a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
256b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
256c0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
256d0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
256e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
256f0 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
25700 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
25710 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
25720 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
25730 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
25740 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
25750 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
25760 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
25770 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
25780 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
25790 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
257a0 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
257b0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
257c0 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
257d0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
257e0 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
257f0 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
25800 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
25810 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
25820 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
25830 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
25840 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
25850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25860 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
25870 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
25880 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
25890 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
258a0 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f   BTCURSOR_FIRST_
258b0 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a  UNINIT));.}../*.
258c0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
258d0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
258e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
258f0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
25900 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
25910 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
25920 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
25930 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
25940 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
25950 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
25960 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
25970 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
25980 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ee ){.    BtShar
25990 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
259a0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
259b0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
259c0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
259d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
259e0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
259f0 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
25a00 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
25a10 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
25a20 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
25a30 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
25a40 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
25a50 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
25a60 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
25a70 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
25a80 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
25a90 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
25aa0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
25ab0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
25ac0 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
25ad0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
25ae0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
25af0 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
25b00 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c    }.    btreeRel
25b10 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
25b20 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e  es(pCur);.    un
25b30 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
25b40 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
25b50 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
25b60 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73  Overflow);.    s
25b70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
25b80 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->pKey);.    sql
25b90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25ba0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75 72  Btree);.    pCur
25bb0 2d 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  ->pBtree = 0;.  
25bc0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25bd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
25be0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
25bf0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
25c00 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
25c10 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
25c20 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
25c30 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
25c40 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
25c50 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
25c60 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
25c70 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
25c80 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
25c90 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
25ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
25cb0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
25cc0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
25cd0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
25ce0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
25cf0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
25d00 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
25d10 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
25d20 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75   int cellInfoEqu
25d30 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20  al(CellInfo *a, 
25d40 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20  CellInfo *b){.  
25d50 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62    if( a->nKey!=b
25d60 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20  ->nKey ) return 
25d70 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50  0;.    if( a->pP
25d80 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c  ayload!=b->pPayl
25d90 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oad ) return 0;.
25da0 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c      if( a->nPayl
25db0 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64  oad!=b->nPayload
25dc0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25dd0 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d   if( a->nLocal!=
25de0 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75  b->nLocal ) retu
25df0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25e00 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65  >nSize!=b->nSize
25e10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25e20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25e30 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
25e40 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
25e50 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
25e60 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
25e70 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
25e80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
25e90 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
25ea0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
25eb0 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69  ge, pCur->ix, &i
25ec0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
25ed0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
25ee0 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69  cellInfoEqual(&i
25ef0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
25f00 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ) );.  }.#else. 
25f10 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
25f20 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
25f30 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
25f40 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
25f50 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
25f60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
25f70 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25f80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  e==0 ){.    pCur
25f90 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25fa0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
25fb0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
25fc0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75  (pCur->pPage,pCu
25fd0 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
25fe0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
25ff0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
26000 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
26010 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
26020 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
26030 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
26040 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
26050 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
26060 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
26070 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
26080 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
26090 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
260a0 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
260b0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
260c0 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
260d0 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
260e0 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
260f0 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
26100 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
26110 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
26120 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
26130 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26140 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
26150 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26160 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
26170 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26180 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
26190 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
261a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
261b0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
261c0 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
261d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
261e0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
261f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26200 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
26210 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26220 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
26230 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
26240 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
26250 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
26260 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
26270 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
26280 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
26290 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
262a0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
262b0 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
262c0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
262d0 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
262e0 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
262f0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
26300 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
26310 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
26320 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
26330 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
26340 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
26350 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26360 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26370 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
26380 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
26390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
263a0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
263b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
263c0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
263d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
263e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
263f0 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
26400 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75  _FUNC./*.** Retu
26410 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  rn the offset in
26420 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26430 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61  file for the sta
26440 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79  rt of the.** pay
26450 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68  load to which th
26460 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
26470 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ting..*/.i64 sql
26480 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28  ite3BtreeOffset(
26490 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
264a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
264b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
264c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
264d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
264e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
264f0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
26500 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29  ;.  return (i64)
26510 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
26520 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e  ize*((i64)pCur->
26530 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29  pPage->pgno - 1)
26540 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34   +.         (i64
26550 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  )(pCur->info.pPa
26560 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50  yload - pCur->pP
26570 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23  age->aData);.}.#
26580 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26590 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
265a0 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  L_FUNC */../*.**
265b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
265c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
265d0 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
265e0 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
265f0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
26600 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
26610 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
26620 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
26630 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
26640 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
26650 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
26660 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
26670 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
26680 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
26690 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
266a0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
266b0 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
266c0 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
266d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
266e0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
266f0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
26700 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
26710 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
26720 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
26730 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
26740 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
26750 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
26760 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
26770 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26780 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26790 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
267a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
267b0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
267c0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
267d0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
267e0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
267f0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75 70  .** Return an up
26800 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
26810 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65 63   size of any rec
26820 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ord for the tabl
26830 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
26840 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
26850 20 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   into..**.** Thi
26860 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
26870 74 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69 6e  tion.  Everythin
26880 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  g will still wor
26890 6b 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  k if this.** rou
268a0 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74 75  tine always retu
268b0 72 6e 73 20 32 31 34 37 34 38 33 36 34 37 20 28  rns 2147483647 (
268c0 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61 72  which is the lar
268d0 67 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74  gest record.** t
268e0 68 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20 68  hat SQLite can h
268f0 61 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20  andle) or more. 
26900 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20 61   But returning a
26910 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d   smaller value m
26920 69 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20  ight.** prevent 
26930 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  large memory all
26940 6f 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74 72  ocations when tr
26950 79 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72 65  ying to interpre
26960 74 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64  t a.** corrupt d
26970 61 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  atrabase..**.** 
26980 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
26990 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c  ementation merel
269a0 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69  y returns the si
269b0 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  ze of the underl
269c0 79 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  ying.** database
269d0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   file..*/.sqlite
269e0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
269f0 74 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69 7a  treeMaxRecordSiz
26a00 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
26a10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
26a20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26a30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26a40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26a50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26a60 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
26a70 74 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  t->pageSize * (s
26a80 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43 75  qlite3_int64)pCu
26a90 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  r->pBt->nPage;.}
26aa0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
26ab0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
26ac0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26ad0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
26ae0 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
26af0 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
26b00 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
26b10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26b20 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
26b30 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
26b40 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
26b50 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
26b60 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
26b70 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
26b80 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
26b90 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
26ba0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
26bb0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
26bc0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
26bd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
26be0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26bf0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26c00 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
26c10 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
26c20 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
26c30 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
26c40 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
26c50 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
26c60 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
26c70 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
26c80 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
26c90 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
26ca0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
26cb0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
26cc0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
26cd0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
26ce0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
26cf0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
26d00 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
26d10 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
26d20 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
26d30 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
26d40 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
26d50 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
26d60 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
26d70 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
26d80 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
26d90 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
26da0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
26db0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
26dc0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
26dd0 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
26de0 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
26df0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
26e00 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
26e10 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
26e20 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
26e30 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
26e40 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
26e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26e60 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26e70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26e80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e90 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
26ea0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
26eb0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
26ec0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
26ed0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26ee0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
26ef0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
26f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26f10 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
26f20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
26f30 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
26f40 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
26f50 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
26f60 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26f70 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
26f80 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
26f90 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
26fa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26fb0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
26fc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
26fd0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
26fe0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
26ff0 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
27000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27010 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
27020 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
27030 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
27040 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
27050 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
27060 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
27070 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
27080 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
27090 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
270a0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
270b0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
270c0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
270d0 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
270e0 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
270f0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
27100 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
27110 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
27120 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
27130 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
27140 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
27150 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
27160 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
27170 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
27180 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
27190 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
271a0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
271b0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
271c0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
271d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
271e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
271f0 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
27200 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
27210 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
27220 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
27230 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
27240 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
27250 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
27260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27270 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
27280 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
27290 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
272a0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
272b0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
272c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
272d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
272e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
272f0 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
27300 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
27310 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27330 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27340 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
27350 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
27360 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
27370 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
27380 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
27390 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
273a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
273b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
273c0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
273d0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
273e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
273f0 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
27400 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
27410 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27420 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
27430 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
27440 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
27450 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
27460 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
27470 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
27480 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
27490 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
274a0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
274b0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
274c0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
274d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
274e0 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
274f0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
27500 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
27510 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
27520 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
27530 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
27540 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
27550 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
27560 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
27570 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
27580 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
27590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
275a0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
275b0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
275c0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
275d0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
275e0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
275f0 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
27600 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
27610 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
27620 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
27630 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
27640 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27650 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
27660 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
27670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
27680 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
27690 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
276a0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
276b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
276c0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
276d0 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
276e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
276f0 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
27700 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27720 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
27730 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
27740 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
27750 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
27760 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27770 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
27780 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
27790 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
277a0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
277b0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
277c0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
277d0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
277e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
277f0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
27800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27810 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
27820 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
27830 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
27840 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
27850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
27860 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
27870 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
27880 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
27890 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
278a0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
278b0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
278c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
278d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
278e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
278f0 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
27900 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
27910 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
27920 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
27930 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
27940 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
27950 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
27960 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
27970 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27980 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
27990 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
279a0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
279b0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
279c0 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
279d0 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
279e0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
279f0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
27a00 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
27a10 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
27a20 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
27a30 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
27a40 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
27a50 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
27a60 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
27a70 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
27a80 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
27a90 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
27aa0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
27ab0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
27ac0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
27ad0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
27ae0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
27af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
27b00 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
27b10 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
27b20 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
27b30 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
27b40 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
27b50 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
27b60 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
27b70 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
27b80 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
27b90 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
27ba0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
27bb0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
27bc0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
27bd0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
27be0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
27bf0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
27c00 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
27c10 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27c20 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
27c30 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
27c40 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
27c50 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
27c60 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
27c70 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
27c80 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
27c90 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
27ca0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
27cb0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
27cc0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
27cd0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
27ce0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
27cf0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
27d00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27d10 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
27d20 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
27d30 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
27d40 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
27d50 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
27d60 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
27d70 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
27d80 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
27d90 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
27da0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
27db0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
27dc0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
27dd0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
27de0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
27df0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
27e00 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
27e10 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
27e20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
27e30 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
27e40 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
27e50 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
27e60 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
27e70 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
27e80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
27e90 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
27ea0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
27eb0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
27ec0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
27ed0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
27ee0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
27ef0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
27f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
27f10 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
27f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27f30 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
27f40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
27f50 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
27f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27f70 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
27f80 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
27f90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27fa0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
27fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27fc0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
27fd0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
27fe0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27ff0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
28000 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28010 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
28020 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
28030 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
28040 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
28050 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
28060 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
28070 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
28080 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
28090 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
280a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
280b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
280c0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
280d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
280e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
280f0 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
28100 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
28110 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
28120 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28130 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
28140 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
28150 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
28160 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
28170 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
28180 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
28190 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
281a0 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
281b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
281c0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
281d0 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
281e0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
281f0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
28200 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
28210 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
28220 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
28230 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
28240 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
28250 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
28260 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
28270 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
28280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
28290 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
282a0 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
282b0 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
282c0 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
282d0 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
282e0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
282f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
28300 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  E(pPage);.  }.. 
28310 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
28320 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
28330 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
28340 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
28350 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
28360 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
28370 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
28380 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
28390 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
283a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
283b0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
283c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
283d0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
283e0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
283f0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
28400 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
28410 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
28420 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
28430 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
28440 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
28450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
28460 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
28470 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
28480 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
28490 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
284a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
284b0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
284c0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
284d0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
284e0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
284f0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
28500 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
28510 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
28520 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
28530 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
28540 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
28550 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
28560 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
28570 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
28580 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
28590 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
285a0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
285b0 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
285c0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
285d0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
285e0 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
285f0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
28600 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
28610 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
28620 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
28630 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
28640 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
28650 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
28660 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
28670 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
28680 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
28690 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
286a0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
286b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
286c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
286d0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
286e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
286f0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
28700 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
28710 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
28720 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
28730 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
28740 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d  pCur->aOverflow=
28750 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76  =0.       || nOv
28760 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50  fl*(int)sizeof(P
28770 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61  gno) > sqlite3Ma
28780 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61  llocSize(pCur->a
28790 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20  Overflow).      
287a0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
287b0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
287c0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
287d0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
287e0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
287f0 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
28800 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28810 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
28820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28830 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28840 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
28850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28860 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
28870 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
28880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
28890 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
288a0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
288b0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
288c0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
288d0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
288e0 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73  idOvfl;.    }els
288f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
28900 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
28910 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
28920 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
28930 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
28940 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
28950 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
28960 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
28970 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20  lid, skip.      
28980 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
28990 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
289a0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
289b0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
289c0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
289d0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
289e0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
289f0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
28a00 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28a10 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66  Idx];.        of
28a20 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
28a30 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
28a40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
28a50 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28a60 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20  OK && amt>0 );. 
28a70 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61     while( nextPa
28a80 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ge ){.      /* I
28a90 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
28aa0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
28ab0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
28ac0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
28ad0 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
28ae0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
28af0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
28b00 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28b10 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
28b30 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
28b40 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
28b50 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
28b60 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  age;..      if( 
28b70 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
28b80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
28b90 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
28ba0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28bb0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
28bc0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
28bd0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
28be0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
28bf0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
28c00 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
28c10 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
28c20 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
28c30 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
28c40 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
28c50 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
28c60 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
28c70 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
28c80 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
28c90 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
28ca0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
28cb0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28cd0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
28ce0 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
28cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28d00 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
28d10 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
28d20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
28d30 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
28d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
28d50 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
28d60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
28d70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
28d80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
28d90 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
28da0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
28db0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
28dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
28dd0 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
28de0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
28df0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
28e00 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
28e10 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
28e20 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
28e30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
28e40 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
28e50 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
28e60 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
28e70 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
28e80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28e90 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
28ea0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
28eb0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
28ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
28ed0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
28ee0 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
28ef0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
28f00 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
28f10 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
28f20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
28f30 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
28f40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28f50 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
28f60 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
28f70 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
28f80 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
28f90 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
28fa0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
28fb0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
28fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
28fd0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
28fe0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
28ff0 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20   page-cache.    
29000 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
29010 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
29020 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
29030 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
29040 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
29050 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
29060 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
29070 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
29080 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
29090 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
290a0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
290b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
290c0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
290d0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
290e0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
290f0 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
29100 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
29110 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
29120 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
29130 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
29140 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
29150 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
29160 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
29170 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
29180 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
29190 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
291a0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
291e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
291f0 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
29230 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
29240 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f  PagerDirectReadO
29250 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  k(pBt->pPager, n
29260 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28  extPage)    /* (
29270 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20  3,4,5) */.      
29280 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
29290 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292b0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
292c0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
292d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
292e0 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74  file *fd = sqlit
292f0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
29300 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
29310 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
29320 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
29330 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
29340 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
29350 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
29360 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20    /* due to (6) 
29390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
293a0 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
293b0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
293c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
293d0 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
293e0 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
293f0 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
29400 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
29410 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
29420 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
29430 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
29440 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
29450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
29460 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
29470 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
29480 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
29490 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
294a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
294b0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
294c0 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
294d0 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d             (eOp=
294e0 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
294f0 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
29500 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29510 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29530 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
29540 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
29550 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
29560 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
29570 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
29580 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
29590 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
295a0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
295b0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
295c0 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
295d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
295e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
295f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
29600 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
29610 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
29620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29630 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
29640 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20     if( amt==0 ) 
29650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29660 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
29670 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29680 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
29690 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a    iIdx++;.    }.
296a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
296b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
296c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  0 ){.    /* Over
296d0 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20  flow chain ends 
296e0 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20  prematurely */. 
296f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29700 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
29710 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
29720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29730 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
29740 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65   payload for the
29750 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
29760 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
29770 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  s currently.** p
29780 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20  ointing.  "amt" 
29790 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
297a0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
297b0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
297c0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
297d0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
297e0 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f  * pCur can be po
297f0 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72  inting to either
29800 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69   a table or an i
29810 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20  ndex b-tree..** 
29820 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  If pointing to a
29830 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68   table btree, th
29840 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  en the content s
29850 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20  ection is read. 
29860 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70   If.** pCur is p
29870 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  ointing to an in
29880 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20  dex b-tree then 
29890 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20  the key section 
298a0 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  is read..**.** F
298b0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
298c0 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61  ayload(), the ca
298d0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
298e0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
298f0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
29900 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20  alid row in the 
29910 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69  table.  For sqli
29920 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
29930 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a  hecked(), the.**
29940 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
29950 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68   invalid or migh
29960 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73  t need to be res
29970 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  tored before bei
29980 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52  ng read..**.** R
29990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
299a0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
299b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
299c0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
299d0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
299e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
299f0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
29a00 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
29a10 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
29a20 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
29a30 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29a40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29a50 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
29a60 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
29a70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
29a80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29a90 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29aa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29ab0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29ac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29ad0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
29ae0 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
29af0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
29b00 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
29b10 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
29b20 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29b30 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
29b40 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
29b50 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
29b60 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
29b70 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29b80 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
29b90 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
29ba0 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
29bb0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
29bc0 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
29bd0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
29be0 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
29bf0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
29c00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29c10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
29c20 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
29c30 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
29c40 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
29c50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29c60 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
29c70 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
29c80 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
29c90 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
29ca0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29cb0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
29cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
29cd0 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
29ce0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29cf0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29d00 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
29d10 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
29d20 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
29d30 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
29d40 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
29d50 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
29d60 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
29d70 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
29d80 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
29d90 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
29da0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
29db0 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
29dc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29dd0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
29de0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29df0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29e00 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
29e10 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29e20 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29e30 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
29e40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
29e50 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
29e60 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
29e70 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
29e80 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
29e90 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
29ea0 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
29eb0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
29ec0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
29ed0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
29ee0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
29ef0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
29f00 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
29f10 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
29f20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
29f30 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
29f40 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
29f50 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
29f60 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
29f70 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
29f80 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
29f90 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
29fa0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
29fb0 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
29fc0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
29fd0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
29fe0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
29ff0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
2a000 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
2a010 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
2a020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a030 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
2a040 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
2a050 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
2a060 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
2a070 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
2a080 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
2a090 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
2a0a0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
2a0b0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
2a0c0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
2a0d0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
2a0e0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
2a0f0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
2a100 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
2a110 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
2a120 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
2a130 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
2a140 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
2a150 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
2a160 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
2a170 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
2a180 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
2a190 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
2a1a0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
2a1b0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
2a1c0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2a1d0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
2a1e0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
2a1f0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
2a200 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
2a210 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
2a220 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
2a230 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
2a240 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
2a250 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
2a260 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2a270 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
2a280 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
2a290 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2a2a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
2a2b0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
2a2c0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
2a2d0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
2a2e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
2a2f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
2a300 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
2a310 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74   */.){.  int amt
2a320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a330 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
2a340 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
2a350 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
2a360 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a370 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a380 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a390 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a3a0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a3b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2a3c0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a3d0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a3e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2a3f0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
2a400 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2a410 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a420 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2a430 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
2a440 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65  load>pCur->pPage
2a450 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
2a460 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
2a470 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
2a480 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61  ayload<pCur->pPa
2a490 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  ge->aDataEnd ||C
2a4a0 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
2a4b0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
2a4c0 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74  Local;.  if( amt
2a4d0 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61  >(int)(pCur->pPa
2a4e0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
2a4f0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2a500 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ad) ){.    /* Th
2a510 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c  ere is too littl
2a520 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
2a530 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65  age for the expe
2a540 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20  cted amount.    
2a550 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74  ** of local cont
2a560 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75  ent. Database mu
2a570 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
2a580 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  /.    assert( CO
2a590 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
2a5a0 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e  amt = MAX(0, (in
2a5b0 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
2a5c0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2a5d0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29  >info.pPayload))
2a5e0 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  ;.  }.  *pAmt = 
2a5f0 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75  (u32)amt;.  retu
2a600 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
2a610 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
2a620 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
2a630 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
2a640 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
2a650 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
2a660 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
2a670 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
2a680 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
2a690 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
2a6a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
2a6b0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
2a6c0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
2a6d0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
2a6e0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
2a6f0 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
2a700 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
2a710 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
2a720 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
2a730 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
2a740 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
2a750 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
2a760 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
2a770 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2a780 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
2a790 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
2a7a0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
2a7b0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
2a7c0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
2a7d0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
2a7e0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
2a7f0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
2a800 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
2a810 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
2a820 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
2a830 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2a840 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
2a850 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
2a860 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
2a870 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
2a880 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72  yloadFetch(BtCur
2a890 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
2a8a0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
2a8b0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
2a8c0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
2a8d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a8e0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
2a8f0 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
2a900 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
2a910 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
2a920 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2a930 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
2a940 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
2a950 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2a960 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
2a970 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
2a980 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
2a990 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
2a9a0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
2a9b0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
2a9c0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
2a9d0 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
2a9e0 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
2a9f0 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
2aa00 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
2aa10 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
2aa20 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
2aa30 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
2aa40 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
2aa50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2aa60 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
2aa70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2aa80 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
2aa90 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2aaa0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2aab0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2aac0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2aad0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2aae0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
2aaf0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
2ab00 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
2ab10 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
2ab20 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
2ab30 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
2ab40 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
2ab50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ab60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ab70 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  }.  pCur->info.n
2ab80 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2ab90 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2aba0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2abb0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2abc0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2abd0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75  ur->iPage] = pCu
2abe0 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61  r->ix;.  pCur->a
2abf0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ac00 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  e] = pCur->pPage
2ac10 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30  ;.  pCur->ix = 0
2ac20 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
2ac30 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  +;.  return getA
2ac40 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2ac50 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
2ac60 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75  pPage, pCur, pCu
2ac70 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2ac80 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
2ac90 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2aca0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
2acb0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
2acc0 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
2acd0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2ace0 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
2acf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
2ad00 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
2ad10 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
2ad20 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
2ad30 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
2ad40 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
2ad50 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
2ad60 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
2ad70 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
2ad80 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
2ad90 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
2ada0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
2adb0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2adc0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
2add0 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
2ade0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
2adf0 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
2ae00 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
2ae10 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
2ae20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
2ae30 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
2ae40 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
2ae50 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2ae70 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
2ae80 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
2ae90 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
2aea0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
2aeb0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
2aec0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
2aed0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
2aee0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2aef0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2af00 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
2af10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2af20 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
2af30 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
2af40 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
2af50 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
2af60 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
2af70 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
2af80 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
2af90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2afa0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
2afb0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
2afc0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
2afd0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
2afe0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2aff0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
2b000 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
2b010 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
2b020 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
2b030 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
2b040 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
2b050 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
2b060 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
2b070 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
2b080 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
2b090 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
2b0a0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
2b0b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2b0c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61  .  MemPage *pLea
2b0d0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f;.  assert( cur
2b0e0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b0f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b100 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2b110 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2b120 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b130 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
2b140 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2b150 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  e );.  assertPar
2b160 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
2b170 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b180 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2b190 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b1a0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2b1b0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67   pCur->pPage->pg
2b1c0 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
2b1d0 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
2b1e0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
2b1f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b200 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
2b210 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
2b220 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2b230 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2b240 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2b250 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2b260 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  fl);.  pCur->ix 
2b270 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2b280 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
2b290 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50  pLeaf = pCur->pP
2b2a0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  age;.  pCur->pPa
2b2b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b2c0 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d  e[--pCur->iPage]
2b2d0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
2b2e0 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d  otNull(pLeaf);.}
2b2f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2b300 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
2b310 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
2b320 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
2b330 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2b340 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2b350 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
2b360 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
2b370 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
2b380 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
2b390 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
2b3a0 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
2b3b0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
2b3c0 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
2b3d0 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
2b3e0 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
2b3f0 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2b400 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2b410 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
2b420 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
2b430 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2b440 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
2b450 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
2b460 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
2b470 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
2b480 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
2b490 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2b4a0 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
2b4b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e  URSOR_INVALID an
2b4c0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
2b4d0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d  eturns SQLITE_EM
2b4e0 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  PTY. Otherwise,.
2b4f0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
2b500 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2b510 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
2b520 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
2b530 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75  oot.** (or virtu
2b540 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
2b550 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
2b560 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
2b570 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
2b580 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2b590 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
2b5a0 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
2b5b0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2b5c0 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
2b5d0 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
2b5e0 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
2b5f0 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
2b600 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
2b610 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
2b620 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
2b630 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2b640 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
2b650 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
2b660 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
2b670 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2b680 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2b690 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
2b6a0 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
2b6b0 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
2b6c0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
2b6d0 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
2b6e0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
2b6f0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2b700 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
2b710 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
2b720 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
2b730 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
2b740 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
2b750 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
2b760 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2b770 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
2b780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b790 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b7a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2b7c0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
2b7d0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b7e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2b7f0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
2b800 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b810 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2b820 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
2b830 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b840 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2b850 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43  pCur->eState < C
2b860 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b870 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  K || pCur->iPage
2b880 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
2b890 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30  pCur->pgnoRoot>0
2b8a0 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c   || pCur->iPage<
2b8b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  0 );..  if( pCur
2b8c0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
2b8d0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2b8e0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  e ){.      relea
2b8f0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
2b900 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
2b910 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d    while( --pCur-
2b920 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2b930 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2b940 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
2b950 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
2b960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b970 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2b980 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
2b990 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e      goto skip_in
2b9a0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
2b9b0 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
2b9c0 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
2b9d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2b9e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2b9f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ba00 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  EMPTY;.  }else{.
2ba10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ba20 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b  ->iPage==(-1) );
2ba30 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
2ba40 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
2ba50 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
2ba60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2ba70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2ba80 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
2ba90 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2baa0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
2bab0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2bac0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
2bad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2bae0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2baf0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
2bb00 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
2bb10 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
2bb20 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
2bb30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
2bb40 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20  pCur->pPage,.   
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb60 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75       0, pCur->cu
2bb70 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20  rPagerFlags);.  
2bb80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bb90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
2bba0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2bbb0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2bbc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bbd0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
2bbe0 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
2bbf0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43  ->curIntKey = pC
2bc00 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
2bc10 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
2bc20 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2bc30 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
2bc40 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
2bc50 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  oot );..  /* If 
2bc60 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
2bc70 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2bc80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
2bc90 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
2bca0 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65  sor.  ** expecte
2bcb0 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
2bcc0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2bcd0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
2bce0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20  KeyInfo is.  ** 
2bcf0 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
2bd00 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
2bd10 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
2bd20 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
2bd30 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e  ,.  ** return an
2bd40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2bd50 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a  error. .  **.  *
2bd60 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  * Earlier versio
2bd70 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73  ns of SQLite ass
2bd80 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74  umed that this t
2bd90 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61  est could not fa
2bda0 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72  il.  ** if the r
2bdb0 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72  oot page was alr
2bdc0 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e  eady loaded when
2bdd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2bde0 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a  as called (i.e..
2bdf0 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50    ** if pCur->iP
2be00 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69  age>=0). But thi
2be10 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74  s is not so if t
2be20 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2be30 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69  orrupted .  ** i
2be40 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
2be50 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20  t page pRoot is 
2be60 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65  linked into a se
2be70 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c  cond b-tree tabl
2be80 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20  e .  ** (or the 
2be90 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20  freelist).  */. 
2bea0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2beb0 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f  intKey==1 || pRo
2bec0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ot->intKey==0 );
2bed0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73  .  if( pRoot->is
2bee0 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Init==0 || (pCur
2bef0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
2bf00 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b  pRoot->intKey ){
2bf10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bf20 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
2bf30 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2bf40 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a  }..skip_init:  .
2bf50 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
2bf60 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2bf70 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2bf80 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2bf90 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2bfa0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2bfb0 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f  lidOvfl);..  pRo
2bfc0 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2bfd0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
2bfe0 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43  Cell>0 ){.    pC
2bff0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2c000 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
2c010 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c  se if( !pRoot->l
2c020 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
2c030 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
2c040 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
2c050 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c060 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2c070 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
2c080 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
2c090 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
2c0a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2c0b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2c0c0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
2c0d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2c0e0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
2c0f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
2c100 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2c110 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
2c120 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
2c130 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2c150 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2c160 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
2c170 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2c180 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
2c190 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
2c1a0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2c1b0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
2c1c0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
2c1d0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2c1e0 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
2c1f0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2c200 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2c210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c220 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
2c230 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2c240 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2c250 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c260 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2c270 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2c280 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2c290 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2c2a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c2b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c2c0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
2c2d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
2c2e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2c2f0 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2c300 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c310 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2c320 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
2c330 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2c340 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29  pPage, pCur->ix)
2c350 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
2c360 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2c370 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2c380 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2c390 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2c3a0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
2c3b0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2c3c0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2c3d0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
2c3e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2c3f0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
2c400 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
2c410 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
2c420 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
2c430 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2c440 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
2c450 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2c460 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
2c470 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
2c480 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
2c490 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
2c4a0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
2c4b0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2c4c0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
2c4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
2c4e0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
2c4f0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2c500 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
2c510 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
2c520 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2c530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c540 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2c550 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c560 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2c570 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c580 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2c590 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
2c5a0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2c5b0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2c5c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c5d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c5e0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2c5f0 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
2c600 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2c610 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
2c620 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2c630 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2c640 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2c650 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2c660 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
2c670 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c680 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
2c690 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c6a0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20  .  }.  pCur->ix 
2c6b0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2c6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c6d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2c6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2c6f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2c700 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
2c710 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2c720 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
2c730 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2c740 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2c750 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2c760 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2c770 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2c780 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2c790 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2c7a0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2c7b0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2c7c0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2c7d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2c7e0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2c7f0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
2c800 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2c810 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2c820 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2c830 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2c840 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2c850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c860 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2c870 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2c880 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
2c890 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2c8a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c8b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2c8c0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2c8d0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a  nCell>0 );.    *
2c8e0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
2c8f0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
2c900 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2c910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c920 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73  EMPTY ){.    ass
2c930 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2c940 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2c950 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2c960 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
2c970 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2c980 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
2c990 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2c9a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2c9b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2c9c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2c9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2c9e0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2c9f0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2ca00 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2ca10 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2ca20 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2ca30 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2ca40 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2ca50 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2ca60 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
2ca70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ca80 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2ca90 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
2caa0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2cab0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2cac0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2cad0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2cae0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2caf0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2cb00 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
2cb10 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
2cb20 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
2cb30 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
2cb40 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
2cb50 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
2cb60 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2cb70 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2cb80 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
2cb90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
2cba0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
2cbb0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
2cbc0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2cbd0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
2cbe0 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
2cbf0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2cc00 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
2cc10 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
2cc20 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
2cc30 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
2cc40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2cc50 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
2cc60 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
2cc70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
2cc80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cc90 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65  >ix==pCur->pPage
2cca0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
2ccb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ccc0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  Page->leaf );.#e
2ccd0 6e 64 69 66 0a 20 20 20 20 2a 70 52 65 73 20 3d  ndif.    *pRes =
2cce0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
2ccf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2cd00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2cd10 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2cd20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cd30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cd40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2cd50 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52  VALID );.    *pR
2cd60 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2cd70 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2cd80 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2cd90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cda0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2cdb0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2cdc0 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Last;.    }else{
2cdd0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2cde0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2cdf0 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tLast;.    }.  }
2ce00 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2ce10 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2ce20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ce30 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2ce40 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2ce50 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2ce60 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2ce70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2ce80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ce90 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2cea0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2ceb0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
2cec0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
2ced0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
2cee0 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
2cef0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
2cf00 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
2cf10 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
2cf20 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
2cf30 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
2cf40 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
2cf50 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
2cf60 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
2cf70 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
2cf80 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
2cf90 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
2cfa0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
2cfb0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
2cfc0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2cfd0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
2cfe0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
2cff0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
2d000 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
2d010 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
2d020 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
2d030 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
2d040 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
2d050 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
2d060 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
2d070 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
2d080 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
2d090 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
2d0a0 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
2d0b0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
2d0c0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
2d0d0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2d0e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
2d0f0 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
2d100 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
2d110 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
2d120 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
2d130 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2d140 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
2d150 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2d160 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2d170 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2d180 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2d190 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2d1a0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2d1b0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
2d1c0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2d1f0 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
2d200 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
2d210 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
2d220 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
2d230 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2d240 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2d250 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2d260 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
2d270 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
2d280 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2d290 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
2d2a0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2d2b0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2d2c0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2d2d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2d2e0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
2d2f0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2d300 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64  y..**.** For ind
2d310 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70  ex tables, the p
2d320 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66  IdxKey->eqSeen f
2d330 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
2d340 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69   if there.** exi
2d350 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  sts an entry in 
2d360 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65  the table that e
2d370 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
2d380 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74  IdxKey.  .*/.int
2d390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2d3a0 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2d3b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2d3c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2d3d0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2d3e0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2d3f0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2d400 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2d410 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2d420 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2d430 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2d440 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2d450 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2d460 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2d470 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2d480 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2d490 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d4b0 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2d4c0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2d4d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2d4e0 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2d4f0 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2d500 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d510 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2d540 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2d550 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2d560 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
2d570 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
2d580 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
2d590 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  nfo==0) );.  ass
2d5a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d5b0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d5c0 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  || (pIdxKey==0)=
2d5d0 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  =(pCur->curIntKe
2d5e0 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  y!=0) );..  /* I
2d5f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2d600 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2d610 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2d620 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2d630 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2d640 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2d650 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2d660 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2d670 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26  pIdxKey==0.   &&
2d680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d690 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2d6a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d6b0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2d6c0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  !=0.  ){.    if(
2d6d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2d6e0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2d6f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d710 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2d720 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2d730 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2d740 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2d750 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2d760 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Last)!=0 ){.    
2d770 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2d780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d7a0 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  }.      /* If th
2d7b0 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20  e requested key 
2d7c0 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  is one more than
2d7d0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
2d7e0 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  y, then.      **
2d7f0 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72   try to get ther
2d800 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42  e using sqlite3B
2d810 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65  treeNext() rathe
2d820 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20  r than a full.  
2d830 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65      ** binary se
2d840 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61  arch.  This is a
2d850 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
2d860 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63  nly.  The correc
2d870 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a  t answer.      *
2d880 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69  * is still obtai
2d890 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73  ned without this
2d8a0 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69   case, only a li
2d8b0 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c  ttle more slowel
2d8c0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
2d8d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31  Cur->info.nKey+1
2d8e0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2d8f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2d900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d910 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2d920 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
2d930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
2d950 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
2d960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2d980 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d990 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d9a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2d9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2d9c0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2d9d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
2d9e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d9f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
2da00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2da10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2da20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2da30 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2da40 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2da50 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2da60 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2da70 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2da80 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2da90 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2daa0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2dab0 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2dac0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2dad0 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2dae0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2daf0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2db00 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2db10 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2db20 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2db30 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2db40 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2db50 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2db60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2db70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2db80 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20  E_EMPTY ){.     
2db90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2dba0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2dbb0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2dbc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2dbd0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
2dbe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2dbf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2dc00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2dc10 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2dc20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dc30 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
2dc40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2dc60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2dc70 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2dc80 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a  e->nCell > 0 );.
2dc90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dca0 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72  iPage==0 || pCur
2dcb0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2dcc0 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2dcd0 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2dce0 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2dcf0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2dd00 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2dd10 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2dd20 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2dd30 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2dd40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2dd50 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a  >pPage;.    u8 *
2dd60 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2dd90 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2dda0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2ddb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2ddc0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2ddd0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2dde0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2ddf0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2de00 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2de10 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2de20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2de30 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2de40 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2de50 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2de60 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2de70 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2de80 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2de90 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2dea0 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2deb0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2dec0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2ded0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2dee0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2def0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2df00 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2df10 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2df20 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2df30 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2df40 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2df50 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2df60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2df70 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2df80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2df90 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2dfa0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2dfb0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2dfc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2dfd0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2dfe0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2dff0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2e000 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2e010 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2e020 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2e030 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2e040 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2e050 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2e060 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2e070 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2e080 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2e090 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2e0a0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2e0b0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2e0c0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2e0d0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2e0e0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2e0f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2e100 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2e110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e120 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2e130 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2e140 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e150 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e160 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
2e170 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e190 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2e1a0 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2e1b0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2e1c0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2e1d0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2e1e0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2e1f0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2e200 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2e210 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2e220 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e230 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2e240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2e250 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2e260 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2e270 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2e280 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2e290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2e2a0 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2e2b0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2e2c0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2e2d0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2e2e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e2f0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2e300 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2e310 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2e320 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2e330 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2e350 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2e360 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2e380 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
2e390 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2e3a0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2e3b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
2e3c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2e3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2e3e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e3f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2e410 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2e420 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2e430 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2e440 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2e450 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
2e460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e470 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2e480 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f     int nCell;  /
2e490 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43  * Size of the pC
2e4a0 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65  ell cell in byte
2e4b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65  s */.        pCe
2e4c0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2e4d0 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2e4e0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2e4f0 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
2e500 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
2e510 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
2e520 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
2e530 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
2e540 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2e550 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
2e560 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
2e570 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
2e580 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
2e590 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
2e5a0 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
2e5b0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
2e5c0 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
2e5d0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2e5e0 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
2e5f0 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
2e600 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
2e610 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2e620 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
2e630 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
2e640 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
2e650 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2e660 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
2e670 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
2e680 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
2e690 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
2e6a0 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
2e6b0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
2e6c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
2e6d0 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
2e6e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2e6f0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
2e700 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
2e710 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2e720 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
2e730 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2e740 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
2e750 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
2e760 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
2e770 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2e780 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
2e790 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
2e7a0 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
2e7b0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2e7c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e7d0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
2e7e0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2e7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2e800 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2e810 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2e820 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
2e830 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e840 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
2e850 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
2e860 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
2e870 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
2e880 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
2e890 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
2e8a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e8b0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
2e8c0 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
2e8d0 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
2e8e0 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
2e8f0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
2e900 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2e910 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
2e920 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2e930 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2e940 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
2e950 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2e960 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2e970 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2e980 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
2e990 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2e9a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e9b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2e9c0 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
2e9d0 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
2e9e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
2e9f0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
2ea00 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
2ea10 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
2ea20 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
2ea30 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
2ea40 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2ea50 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2ea60 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
2ea70 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
2ea80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2ea90 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
2eaa0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
2eab0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
2eac0 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  d. .          **
2ead0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2eae0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2eaf0 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63  orrupt, the xRec
2eb00 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69  ordCompare routi
2eb10 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20  ne may read.    
2eb20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74        ** up to t
2eb30 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
2eb40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2eb50 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20  uffer. An extra 
2eb60 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  18 .          **
2eb70 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
2eb80 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  g is allocated a
2eb90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2eba0 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20   buffer in.     
2ebb0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69       ** case thi
2ebc0 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20  s happens.  */. 
2ebd0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
2ebe0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2ebf0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
2ec00 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
2ec10 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
2ec20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2ec30 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4f 76 65 72   const int nOver
2ec40 72 75 6e 20 3d 20 31 38 3b 20 20 2f 2a 20 53 69  run = 18;  /* Si
2ec50 7a 65 20 6f 66 20 74 68 65 20 6f 76 65 72 72 75  ze of the overru
2ec60 6e 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20 20  n padding */.   
2ec70 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2ec80 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2ec90 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2eca0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2ecb0 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2ecc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2ecd0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2ece0 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2ecf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2ed00 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2ed10 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2ed20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2ed30 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2ed40 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2ed50 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2ed60 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2ed70 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2ed80 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2ed90 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2eda0 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2edb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2edc0 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2edd0 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2ede0 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2edf0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2ee00 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f 70 43  ll<2 || nCell/pC
2ee10 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
2ee20 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d 3e 6e  ize>pCur->pBt->n
2ee30 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2ee40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ee50 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
2ee60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2ee70 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ee80 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2ee90 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
2eea0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
2eeb0 6c 6f 63 28 20 6e 43 65 6c 6c 2b 6e 4f 76 65 72  loc( nCell+nOver
2eec0 72 75 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  run );.         
2eed0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2eee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2ef00 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2ef10 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2ef20 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2ef30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2ef40 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2ef50 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2ef60 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2ef70 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2ef80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2ef90 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2efa0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 28          memset((
2efb0 28 75 38 2a 29 70 43 65 6c 6c 4b 65 79 29 2b 6e  (u8*)pCellKey)+n
2efc0 43 65 6c 6c 2c 30 2c 6e 4f 76 65 72 72 75 6e 29  Cell,0,nOverrun)
2efd0 3b 20 2f 2a 20 46 69 78 20 75 6e 69 6e 69 74 20  ; /* Fix uninit 
2efe0 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20 20 20  warnings */.    
2eff0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2f000 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
2f010 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20  lidOvfl;.       
2f020 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f040 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2f050 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f060 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2f070 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f080 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
2f090 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
2f0a0 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
2f0b0 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
2f0c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f0d0 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2f0e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f0f0 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
2f100 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
2f110 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2f120 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
2f130 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
2f140 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2f150 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
2f160 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
2f170 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f180 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2f190 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
2f1a0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2f1b0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
2f1c0 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
2f1d0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2f1e0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
2f1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f200 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
2f210 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2f220 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
2f230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f240 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2f250 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2f260 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2f270 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
2f280 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2f290 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2f2a0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2f2b0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
2f2c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
2f2d0 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  >upr ) break;.  
2f2e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2f2f0 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2f300 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2f310 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2f320 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f  = (lwr+upr)/2 */
2f330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f340 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
2f350 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
2f360 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2f370 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
2f380 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2f390 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
2f3a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2f3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f3c0 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
2f3d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2f3e0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2f3f0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2f400 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2f410 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f420 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2f430 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2f440 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2f450 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2f460 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2f470 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2f480 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2f490 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2f4a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2f4b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2f4c0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2f4d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2f4e0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2f4f0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c  Cur->ix = (u16)l
2f500 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2f510 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2f520 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2f530 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2f540 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2f550 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f560 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2f570 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2f580 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2f590 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  l)==0 );.  retur
2f5a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f5b0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2f5c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2f5d0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2f5e0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
2f5f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
2f600 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2f610 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
2f620 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f630 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
2f640 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2f650 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
2f660 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f670 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
2f680 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2f690 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
2f6a0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2f6b0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2f6c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2f6d0 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
2f6e0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
2f6f0 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
2f700 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
2f710 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
2f720 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
2f730 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
2f740 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
2f750 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
2f760 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
2f770 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
2f780 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
2f790 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
2f7a0 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
2f7b0 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
2f7c0 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
2f7d0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
2f7e0 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d   Return an estim
2f7f0 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  ate for the numb
2f800 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2f810 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75  e table that pCu
2f820 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  r is.** pointing
2f830 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e   to.  Return a n
2f840 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
2f850 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73  f no estimate is
2f860 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61   currently .** a
2f870 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34  vailable..*/.i64
2f880 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77   sqlite3BtreeRow
2f890 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f  CountEst(BtCurso
2f8a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20  r *pCur){.  i64 
2f8b0 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73  n;.  u8 i;..  as
2f8c0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f8d0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f8e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2f8f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2f900 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2f910 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2f920 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20   Currently this 
2f930 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c  interface is onl
2f940 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  y called by the 
2f950 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a  OP_IfSmaller.  *
2f960 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74  * opcode, and it
2f970 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63   that case the c
2f980 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79  ursor will alway
2f990 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20  s be valid and. 
2f9a0 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   ** will always 
2f9b0 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20  point to a leaf 
2f9c0 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  node. */.  if( N
2f9d0 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74  EVER(pCur->eStat
2f9e0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e!=CURSOR_VALID)
2f9f0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
2fa00 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
2fa10 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20  pPage->leaf==0) 
2fa20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20  ) return -1;..  
2fa30 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  n = pCur->pPage-
2fa40 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d  >nCell;.  for(i=
2fa50 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  0; i<pCur->iPage
2fa60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d  ; i++){.    n *=
2fa70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
2fa80 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72  ->nCell;.  }.  r
2fa90 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
2faa0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2fab0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2fac0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2fad0 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75  tabase. .** Retu
2fae0 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20  rn value:.**.** 
2faf0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
2fb00 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
2fb10 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20    SQLITE_DONE   
2fb20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72     cursor is alr
2fb30 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74  eady pointing at
2fb40 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
2fb50 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73  t.**    otherwis
2fb60 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69  e        some ki
2fb70 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75  nd of error occu
2fb80 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  rred.**.** The m
2fb90 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2fba0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
2fbb0 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
2fbc0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2fbd0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2fbe0 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2fbf0 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
2fc00 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2fc10 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2fc20 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
2fc30 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2fc40 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2fc50 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
2fc60 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
2fc70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2fc80 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2fc90 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2fca0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
2fcb0 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
2fcc0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2fcd0 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f  ** If bit 0x01 o
2fce0 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74  f the F argument
2fcf0 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
2fd00 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20  Next(C,F) is 1, 
2fd10 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73  then the.** curs
2fd20 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  or corresponds t
2fd30 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2fd40 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2fd50 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
2fd60 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  ** skipped if th
2fd70 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  e SQL index had 
2fd80 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e  been a unique in
2fd90 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75  dex.  The F argu
2fda0 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e  ment.** is a hin
2fdb0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
2fdc0 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65  nt.  SQLite btre
2fdd0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2fde0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
2fdf0 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
2fe00 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
2fe10 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2fe20 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2fe30 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2fe40 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
2fe50 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2fe60 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2fe70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2fe80 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2fe90 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2fea0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2feb0 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2fec0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2fed0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2fee0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2fef0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2ff00 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ff10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ff20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ff30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ff40 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2ff50 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2ff60 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ff70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2ff80 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2ff90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ffa0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2ffb0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2ffc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2ffd0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2ffe0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
2fff0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30000 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
30010 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30020 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b  pPage;.  idx = +
30030 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28  +pCur->ix;.  if(
30040 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
30050 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e  ){.    /* The on
30060 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72  ly known way for
30070 20 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e 20   this to happen 
30080 69 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  is for there to 
30090 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63 75  be a.    ** recu
300a0 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74 69  rsive SQL functi
300b0 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 44  on that does a D
300c0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  ELETE operation 
300d0 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20 20  as part of a.   
300e0 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63 68   ** SELECT which
300f0 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74   deletes content
30100 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
30110 61 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  an active cursor
30120 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72  .    ** in a cor
30130 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
30140 6c 65 20 77 68 65 72 65 20 74 68 65 20 74 61 62  le where the tab
30150 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45 2d  le being DELETE-
30160 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68  ed from.    ** h
30170 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d  as pages in comm
30180 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  on with the tabl
30190 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e  e being queried.
301a0 20 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a 2a    See TH3.    **
301b0 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74 72   module cov1/btr
301c0 65 65 37 38 2e 74 65 73 74 20 74 65 73 74 63 61  ee78.test testca
301d0 73 65 20 32 32 30 20 28 32 30 31 38 2d 30 36 2d  se 220 (2018-06-
301e0 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a  08) for an.    *
301f0 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20  * example. */.  
30200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
30220 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
30230 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30240 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
30250 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
30260 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
30270 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
30280 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
30290 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
302a0 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
302b0 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
302c0 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
302d0 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
302e0 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
302f0 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
30300 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
30310 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
30320 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
30330 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
30340 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
30350 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
30360 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
30370 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
30380 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
30390 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
303a0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
303b0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
303c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
303d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
303e0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
303f0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
30400 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30410 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
30420 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30430 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
30440 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
30450 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
30460 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
30470 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
30480 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
30490 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
304a0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
304b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
304c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
304d0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
304e0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
304f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
30500 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
30510 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ->ix>=pPage->nCe
30520 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ll );.    if( pP
30530 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
30540 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
30550 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
30560 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 0);.    }else
30570 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
30580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
30590 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
305a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
305b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
305c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
305d0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
305e0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
305f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
30600 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
30610 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ur, int flags){.
30620 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30630 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30640 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20  ETER( flags );  
30650 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42  /* Used in COMDB
30660 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65  2 but not native
30670 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73   SQLite */.  ass
30680 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
30690 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
306a0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
306b0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20  ==0 || flags==1 
306c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
306d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
306e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
306f0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
30700 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
30710 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
30720 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
30730 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
30740 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50  Next(pCur);.  pP
30750 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
30760 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  e;.  if( (++pCur
30770 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->ix)>=pPage->nC
30780 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
30790 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  >ix--;.    retur
307a0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
307b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
307c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
307d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
307e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
307f0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
30800 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
30810 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
30820 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
30830 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
30840 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
30850 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
30860 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
30870 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
30880 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
30890 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
308a0 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
308b0 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
308c0 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
308d0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
308e0 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
308f0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
30900 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
30910 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
30920 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
30930 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
30940 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
30950 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
30960 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
30970 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
30980 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
30990 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
309a0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
309b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
309c0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
309d0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
309e0 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
309f0 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
30a00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
30a10 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
30a20 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
30a30 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
30a40 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
30a50 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
30a60 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
30a70 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
30a80 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74  ent to sqlite3Bt
30a90 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29  reePrevious(C,F)
30aa0 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74   is 1, then.** t
30ab0 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  he cursor corres
30ac0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
30ad0 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
30ae0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
30af0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
30b00 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
30b10 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
30b20 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
30b30 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61   F argument is a
30b40 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20  .** hint to the 
30b50 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20  implement.  The 
30b60 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74  native SQLite bt
30b70 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
30b80 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75  on does not.** u
30b90 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  se this hint, bu
30ba0 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
30bb0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
30bc0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
30bd0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
30be0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
30bf0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
30c00 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
30c10 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
30c20 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
30c30 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
30c40 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
30c50 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
30c60 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
30c70 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
30c80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
30c90 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
30ca0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
30cb0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
30cc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
30cd0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
30ce0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
30cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30d00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
30d10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
30d20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
30d30 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
30d40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30d50 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
30d60 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
30d70 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e  SKIPNEXT==pCur->
30d80 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
30d90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
30da0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
30db0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
30dc0 70 4e 65 78 74 3c 30 20 29 20 72 65 74 75 72 6e  pNext<0 ) return
30dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30de0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
30df0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30e00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
30e10 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
30e20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30e30 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
30e40 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
30e50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
30e60 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
30e70 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
30e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
30ea0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
30eb0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
30ec0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
30ed0 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
30ee0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
30ef0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
30f00 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
30f10 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
30f20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30f30 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
30f40 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
30f50 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
30f60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
30f70 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
30f80 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
30f90 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30fa0 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
30fb0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
30fc0 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
30fd0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
30fe0 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  >pPage;.    if( 
30ff0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
31000 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31010 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31020 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
31030 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
31040 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
31050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31060 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
31070 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
31080 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
31090 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
310a0 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
310b0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
310c0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
310d0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
310e0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
310f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
31100 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20  ETER( flags );  
31110 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42  /* Used in COMDB
31120 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65  2 but not native
31130 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75   SQLite */.  pCu
31140 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
31150 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
31160 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
31170 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
31180 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
31190 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
311a0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
311b0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
311c0 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  ->ix==0.   || pC
311d0 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
311e0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
311f0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
31200 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43  (pCur);.  }.  pC
31210 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75  ur->ix--;.  retu
31220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31230 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
31240 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
31250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31260 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
31270 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
31280 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
31290 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
312a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
312b0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
312c0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
312d0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
312e0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
312f0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
31300 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
31310 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
31320 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31330 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
31340 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
31350 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
31360 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
31370 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
31380 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
31390 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
313a0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
313b0 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
313c0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
313d0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
313e0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
313f0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
31400 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
31410 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31420 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
31430 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
31440 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
31450 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
31460 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
31470 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
31480 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
31490 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
314a0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
314b0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
314c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
314d0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
314e0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
314f0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
31500 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
31510 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
31520 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
31530 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
31540 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
31550 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
31560 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
31570 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
31580 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
31590 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
315a0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
315b0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
315c0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
315d0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
315e0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
315f0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
31600 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
31610 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
31620 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
31630 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
31640 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
31650 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
31670 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
31680 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
31690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
316a0 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
316b0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
316c0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
316d0 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
316e0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
316f0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
31700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
31710 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
31720 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
31730 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
31740 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
31750 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
31760 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
31770 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
31780 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
31790 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
317a0 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
317b0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
317c0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
317d0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
317e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
317f0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31800 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
31810 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31820 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
31830 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
31840 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
31850 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
31860 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
31870 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
31880 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
31890 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
318a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
318b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
318c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
318d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
318e0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
318f0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
31900 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
31910 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
31920 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
31930 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
31940 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
31950 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
31960 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
31970 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
31980 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
31990 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
319a0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
319b0 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
319c0 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
319d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
319e0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
319f0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
31a00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
31a10 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
31a20 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
31a30 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
31a40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
31a50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31a60 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
31a70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
31a80 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
31a90 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
31aa0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
31ab0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
31ac0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
31ad0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
31ae0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
31af0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
31b00 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
31b10 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
31b20 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
31b30 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
31b40 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
31b50 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
31b60 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
31b70 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
31b80 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
31b90 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
31ba0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
31bb0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
31bc0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
31bd0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
31be0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
31bf0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
31c00 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
31c10 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
31c20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
31c30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31c40 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
31c50 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
31c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
31c70 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
31c80 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
31c90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31ca0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
31cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
31cc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
31cd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
31ce0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
31cf0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
31d00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
31d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31d20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
31d30 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
31d40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
31d50 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
31d60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31d70 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
31d80 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
31d90 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
31da0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
31db0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
31dc0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
31dd0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
31de0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
31df0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
31e00 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
31e10 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
31e20 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
31e30 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
31e40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
31e50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31e60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
31e70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31e80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
31e90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31ea0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
31eb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
31ec0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
31ed0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
31ee0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
31ef0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
31f00 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
31f10 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
31f20 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
31f30 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
31f40 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
31f50 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
31f60 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
31f70 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
31f80 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
31f90 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
31fa0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
31fb0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
31fc0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
31fd0 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
31fe0 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
31ff0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
32000 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
32010 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
32020 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
32030 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
32040 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
32050 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
32060 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
32070 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
32080 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
32090 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
320a0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
320b0 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
320c0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
320d0 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
320e0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
320f0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
32100 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
32110 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
32120 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
32130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
32140 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
32150 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
32160 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
32170 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
32180 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
32190 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
321a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
321b0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
321c0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
321d0 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
321e0 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
321f0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
32200 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
32210 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32220 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
32230 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
32240 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
32250 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
32260 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
32270 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
32280 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
32290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
322a0 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20  NO(pPrevTrunk ? 
322b0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f  pPrevTrunk->pgno
322c0 20 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 1);.      }el
322d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
322e0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
322f0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32300 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
32310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32320 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
32330 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
32340 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32350 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32360 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32370 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
32380 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
32390 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
323a0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
323b0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
323c0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
323d0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
323e0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
323f0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
32400 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
32410 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
32420 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
32430 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
32440 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
32450 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
32460 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
32470 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
32480 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
32490 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
324a0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
324b0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
324c0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
324d0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
324e0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
324f0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
32500 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
32510 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
32520 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
32530 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
32540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32550 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32560 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32570 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32580 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32590 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
325a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
325b0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
325c0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
325d0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
325e0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
325f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32600 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32610 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32620 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32630 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32640 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
32650 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
32660 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
32670 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
32680 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
32690 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
326a0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
326b0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
326c0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
326d0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
326e0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
326f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32700 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
32710 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
32720 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32730 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
32740 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32750 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
32760 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
32770 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
32780 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
32790 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
327a0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
327b0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
327c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
327d0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
327e0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
327f0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
32800 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
32810 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
32820 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
32830 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
32840 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
32850 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
32860 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
32870 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
32880 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
32890 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
328a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
328b0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
328c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
328d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
328e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
328f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32910 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
32920 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
32930 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
32940 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
32950 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
32960 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
32970 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
32980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
329a0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
329b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
329c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
329d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
329e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
329f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32a00 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32a20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
32a30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32a40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
32a50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
32a60 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
32a70 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
32a80 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
32a90 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
32aa0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
32ab0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
32ac0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
32ad0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
32ae0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
32af0 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
32b00 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
32b10 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
32b20 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
32b30 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
32b40 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
32b50 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
32b60 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
32b70 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
32b80 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
32b90 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
32ba0 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
32bb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32bc0 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
32bd0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32be0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32bf0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32c10 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
32c20 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
32c30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
32c40 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
32c50 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
32c60 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
32c70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
32ca0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32cb0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
32cc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32cd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32ce0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
32cf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32d10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32d20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
32d30 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32d40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32d50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32d70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
32d80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32d90 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
32da0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
32db0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
32dc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
32dd0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
32de0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
32df0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
32e00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
32e10 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
32e20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32e30 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
32e40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
32e50 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
32e60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
32e70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32e80 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
32e90 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
32ea0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32eb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32ec0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
32ed0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32ef0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32f00 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
32f10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32f20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
32f40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32f50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32f60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
32f70 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
32f80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32f90 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
32fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32fb0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
32fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
32fd0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
32fe0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
32ff0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
33000 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
33010 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
33020 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
33030 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
33040 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
33050 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
33060 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
33070 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
33080 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
33090 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
330a0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
330b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
330c0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
330d0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
330e0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
330f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33100 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
33110 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
33120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
33130 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33140 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
33150 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
33160 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
33170 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
33180 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
33190 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
331a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
331b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
331c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
331d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
331e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
331f0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
33200 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33210 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
33220 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
33230 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
33240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
33250 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
33260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33270 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
33280 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
33290 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
332a0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
332b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
332c0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
332d0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
332e0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
332f0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
33300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33320 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33340 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
33350 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
33360 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
33370 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
33380 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
33390 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
333a0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
333b0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
333c0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
333d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
333e0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
333f0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
33400 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
33410 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
33420 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
33430 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
33440 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
33450 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
33460 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
33470 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
33480 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
33490 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
334a0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
334b0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
334c0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
334d0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
334e0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
334f0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
33500 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
33510 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33530 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
33540 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
33550 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
33560 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
33570 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
33580 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
33590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
335a0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
335b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
335c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
335d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
335e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
335f0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
33600 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
33610 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
33620 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
33630 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
33640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33650 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
33660 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
33670 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
33680 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
33690 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
336a0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
336b0 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
336c0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
336d0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
336e0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
336f0 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
33700 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
33710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33720 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33730 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33740 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
33750 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
33760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33780 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33790 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
337a0 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
337b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
337c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
337d0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
337e0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
337f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
33810 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
33820 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
33830 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
33840 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
33850 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
33860 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
33870 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
33880 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
33890 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
338a0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
338b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
338c0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
338d0 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
338e0 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
338f0 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
33900 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
33910 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
33920 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
33930 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
33940 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
33950 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
33960 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
33970 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
33980 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
33990 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
339a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
339b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
339c0 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
339d0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
339e0 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
339f0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
33a00 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
33a10 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
33a20 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
33a30 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
33a40 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
33a50 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
33a60 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
33a70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
33a80 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
33a90 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
33aa0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
33ab0 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
33ac0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
33ad0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
33ae0 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
33af0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
33b00 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
33b10 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
33b20 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
33b30 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
33b40 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
33b50 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
33b60 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
33b70 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
33b80 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
33b90 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
33ba0 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
33bb0 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
33bc0 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
33bd0 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
33be0 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
33bf0 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
33c00 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
33c10 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
33c20 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
33c30 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
33c40 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
33c50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33c60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
33c70 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
33c80 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
33c90 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f  ->bDoTruncate))?
33ca0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
33cb0 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20  TENT:0;..    rc 
33cc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33cd0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
33ce0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
33cf0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33d00 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
33d10 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
33d20 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
33d30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33d40 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
33d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33d60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33d70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
33d80 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
33d90 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
33da0 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
33db0 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
33dc0 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
33dd0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
33de0 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
33df0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
33e00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
33e10 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
33e20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
33e30 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
33e40 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
33e50 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
33e60 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
33e70 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
33e80 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
33e90 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
33ea0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
33eb0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
33ec0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
33ed0 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
33ee0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
33ef0 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
33f00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
33f10 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
33f20 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
33f30 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
33f40 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
33f50 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
33f60 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
33f70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33fa0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
33fb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
33fc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
33fd0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
33fe0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33ff0 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
34000 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
34010 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
34020 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34030 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
34040 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
34050 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
34060 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
34070 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
34080 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
34090 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
340a0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
340b0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
340c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
340d0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
340e0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
340f0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
34100 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
34110 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
34120 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34140 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
34150 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
34160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
34180 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
34190 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
341a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  = 0;.    }.    T
341b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
341c0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
341d0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
341e0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
341f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
34200 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
34210 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
34220 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
34230 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
34240 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
34250 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
34260 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
34270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34280 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
34290 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
342a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
342b0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
342c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
342d0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
342e0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
342f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
34300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34310 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
34320 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
34330 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
34340 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
34350 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
34360 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
34370 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
34380 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
34390 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
343a0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
343b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
343c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
343d0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
343e0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
343f0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
34400 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
34410 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
34420 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
34430 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
34440 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
34450 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
34460 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
34470 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
34480 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
34490 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
344a0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
344b0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
344c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
344d0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
344e0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
344f0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
34500 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
34510 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
34520 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
34530 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
34540 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
34550 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
34560 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
34570 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
34580 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
34590 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
345a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
345b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
345c0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
345d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
345e0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
345f0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
34600 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
34610 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
34620 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
34630 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
34640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34650 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
34660 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
34670 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
34680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34690 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
346a0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn Code */.  u32
346b0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346d0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
346e0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
346f0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
34700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34710 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
34720 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
34730 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
34740 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
34750 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
34760 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
34770 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
34780 66 28 20 69 50 61 67 65 3c 32 20 7c 7c 20 69 50  f( iPage<2 || iP
34790 61 67 65 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29  age>pBt->nPage )
347a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
347b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
347c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
347d0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
347e0 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
347f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
34800 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
34810 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34820 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
34830 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
34840 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
34850 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
34860 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
34870 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
34880 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34890 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
348a0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
348b0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
348c0 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
348d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
348e0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
348f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
34900 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
34910 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
34920 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
34930 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
34940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
34950 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
34960 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
34970 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
34980 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
34990 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
349a0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
349b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
349c0 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
349d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
349e0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
349f0 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
34a00 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
34a10 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
34a20 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
34a30 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
34a40 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
34a50 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34a60 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
34a70 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
34a80 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
34a90 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
34aa0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
34ab0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
34ac0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
34ad0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
34ae0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
34af0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
34b00 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
34b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
34b20 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
34b30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34b40 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
34b50 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
34b60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
34b70 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
34b90 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
34ba0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
34bb0 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
34bc0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
34bd0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
34be0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
34bf0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
34c00 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
34c10 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
34c20 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
34c30 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
34c40 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
34c50 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
34c60 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
34c70 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
34c80 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
34c90 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
34ca0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
34cb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
34cc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
34cd0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
34ce0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
34cf0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
34d00 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
34d10 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
34d20 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
34d30 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
34d40 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
34d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d60 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
34d70 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
34d80 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
34d90 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
34da0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
34db0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
34dc0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
34dd0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
34de0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
34df0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34e00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
34e10 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
34e20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
34e30 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
34e40 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
34e50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
34e60 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
34e70 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
34e80 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
34e90 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
34ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34eb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
34ec0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34ed0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
34ee0 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
34ef0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
34f00 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
34f10 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
34f20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
34f30 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
34f40 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
34f50 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
34f60 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
34f70 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
34f80 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
34f90 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
34fa0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
34fb0 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
34fc0 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
34fd0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
34fe0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
34ff0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
35000 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
35010 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
35020 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
35030 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
35040 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
35050 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
35060 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
35070 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
35080 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
35090 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
350a0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
350b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
350c0 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
350d0 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
350e0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
350f0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
35100 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
35110 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
35120 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
35130 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
35140 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
35150 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
35160 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
35170 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
35180 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
35190 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
351a0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
351b0 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
351c0 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
351d0 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
351e0 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
351f0 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
35200 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
35210 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
35220 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
35230 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
35240 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
35250 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
35260 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
35270 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
35280 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
35290 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
352a0 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
352b0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
352c0 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
352d0 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
352e0 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
352f0 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
35300 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
35310 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
35320 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
35330 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
35340 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
35350 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
35360 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
35370 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
35380 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
35390 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
353a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
353b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
353c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
353d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
353e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
353f0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
35400 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
35410 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
35420 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
35430 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
35440 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
35450 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
35460 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
35470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35480 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
35490 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
354a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
354b0 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
354c0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
354d0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
354e0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
354f0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
35500 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
35510 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
35520 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
35530 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
35540 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
35550 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
35560 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
35570 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
35580 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
35590 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
355a0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
355b0 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
355c0 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
355d0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
355e0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
355f0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
35600 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
35610 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
35620 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
35630 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
35640 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
35650 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
35660 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
35670 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
35680 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
35690 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
356a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
356b0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
356c0 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
356d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
356e0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
356f0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
35700 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
35710 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
35720 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
35730 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
35740 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
35750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35760 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
35770 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
35780 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
35790 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
357a0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
357b0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
357c0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
357d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
357e0 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
357f0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
35800 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
35810 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
35820 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
35830 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
35840 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
35850 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
35860 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
35870 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
35880 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
35890 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
358a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
358b0 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
358c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
358d0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
358e0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
358f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
35900 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
35910 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
35920 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
35930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
35940 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
35950 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
35960 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
35970 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a  l.  Store.** siz
35980 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
35990 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  out the cell in 
359a0 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  pInfo..*/.static
359b0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a   int clearCell(.
359c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
359d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
359e0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
359f0 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f  ains the Cell */
35a00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35a10 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46   *pCell,    /* F
35a20 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
35a30 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49   Cell */.  CellI
35a40 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
35a50 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f      /* Size info
35a60 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
35a70 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42  e cell */.){.  B
35a80 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
35a90 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
35aa0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
35ab0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
35ac0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
35ad0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
35ae0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
35af0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
35b00 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
35b10 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
35b20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49  pInfo);.  if( pI
35b30 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e  nfo->nLocal==pIn
35b40 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a  fo->nPayload ){.
35b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35b60 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
35b70 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
35b80 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
35b90 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
35ba0 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  }.  testcase( pC
35bb0 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69  ell + pInfo->nSi
35bc0 7a 65 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61  ze == pPage->aDa
35bd0 74 61 45 6e 64 20 29 3b 0a 20 20 74 65 73 74 63  taEnd );.  testc
35be0 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 28 70 49  ase( pCell + (pI
35bf0 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d  nfo->nSize-1) ==
35c00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
35c10 20 29 3b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20   );.  if( pCell 
35c20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e  + pInfo->nSize >
35c30 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
35c40 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20   ){.    /* Cell 
35c50 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
35c60 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   of page */.    
35c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
35c80 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
35c90 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  );.  }.  ovflPgn
35ca0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
35cb0 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
35cc0 65 20 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20  e - 4);.  pBt = 
35cd0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
35ce0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
35cf0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
35d00 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
35d10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35d20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
35d30 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
35d40 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
35d50 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
35d60 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
35d70 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
35d80 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
35d90 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
35da0 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
35db0 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
35dc0 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
35dd0 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
35de0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
35df0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
35e00 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
35e10 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
35e20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
35e30 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
35e40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
35e50 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
35e60 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
35e70 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
35e80 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
35e90 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
35ea0 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
35eb0 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
35ec0 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
35ed0 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
35ee0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
35ef0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
35f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
35f10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
35f20 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
35f30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
35f40 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
35f50 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
35f60 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
35f70 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
35f80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
35f90 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
35fa0 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
35fb0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
35fc0 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
35fd0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
35fe0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
35ff0 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
36000 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
36010 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
36020 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
36030 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
36040 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
36050 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
36060 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
36070 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
36080 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
36090 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
360a0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
360b0 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
360c0 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
360d0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
360e0 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
360f0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
36100 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
36110 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36120 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
36130 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
36140 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
36150 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
36160 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
36170 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
36180 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
36190 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
361a0 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
361b0 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
361c0 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
361d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
361e0 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
361f0 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
36200 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
36210 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
36220 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
36230 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
36240 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
36250 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
36260 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
36270 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
36280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
36290 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
362a0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
362b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
362c0 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
362d0 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
362e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
362f0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
36300 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
36310 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
36320 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
36330 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36340 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
36350 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
36360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
36370 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
36380 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
36390 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
363a0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
363b0 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
363c0 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
363d0 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
363e0 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
363f0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
36400 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
36410 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
36420 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
36430 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
36440 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
36450 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
36460 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
36470 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
36480 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
36490 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
364a0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
364b0 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
364c0 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
364d0 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
364e0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
364f0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
36500 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
36510 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
36520 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
36530 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
36540 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
36550 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
36560 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
36570 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
36580 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
36590 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
365a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
365b0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
365c0 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
365d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
365e0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
365f0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
36600 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
36610 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
36620 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
36630 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
36640 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
36650 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
36660 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
36670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36680 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
36690 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
366a0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
366b0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
366c0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
366d0 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70  rc, mn;.  int sp
366e0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
366f0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a  ge *pToRelease;.
36700 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
36710 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
36720 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
36730 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
36740 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
36750 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61  Ovfl;.  int nHea
36760 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
36770 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
36780 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
36790 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
367a0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
367b0 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
367c0 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
367d0 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
367e0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
367f0 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
36800 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
36810 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
36820 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
36830 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
36840 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
36850 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42  >aData[pPage->pB
36860 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36870 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36880 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36890 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
368a0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
368b0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
368c0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
368d0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
368e0 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
368f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
36900 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
36910 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
36920 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
36930 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
36940 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
36950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
36960 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
36970 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
36980 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
36990 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
369a0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
369b0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
369c0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
369d0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
369e0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
369f0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
36a00 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
36a10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36a20 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
36a30 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
36a40 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
36a50 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
36a60 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
36a70 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
36a80 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
36a90 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
36aa0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
36ab0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
36ac0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
36ad0 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70  e payload */.  p
36ae0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
36af0 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28  [nHeader];.  if(
36b00 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
36b10 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
36b20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
36b30 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
36b40 72 65 20 65 76 65 72 79 74 68 69 6e 67 20 66 69  re everything fi
36b50 74 73 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  ts on the btree 
36b60 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  page.    ** and 
36b70 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
36b80 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20  s are required. 
36b90 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  */.    n = nHead
36ba0 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
36bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
36bc0 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
36bd0 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
36be0 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
36bf0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
36c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 72  .    assert( nSr
36c10 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  c<=nPayload );. 
36c20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 72     testcase( nSr
36c30 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  c<nPayload );.  
36c40 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36c50 64 2c 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a  d, pSrc, nSrc);.
36c60 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
36c70 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61  oad+nSrc, 0, nPa
36c80 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20  yload-nSrc);.   
36c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36ca0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
36cb0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
36cc0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
36cd0 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  at some of the c
36ce0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64  ontent will need
36cf0 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f  .  ** to spill o
36d00 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
36d10 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20  es..  */.  mn = 
36d20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
36d30 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61  .  n = mn + (nPa
36d40 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
36d50 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36d60 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65  eSize - 4);.  te
36d70 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
36d80 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
36d90 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
36da0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
36db0 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67  ;.  if( n > pPag
36dc0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
36dd0 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66  = mn;.  spaceLef
36de0 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65  t = n;.  *pnSize
36df0 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
36e00 20 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26   4;.  pPrior = &
36e10 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
36e20 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d  ;.  pToRelease =
36e30 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d   0;.  pgnoOvfl =
36e40 20 30 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   0;.  pBt = pPag
36e50 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74  e->pBt;..  /* At
36e60 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
36e70 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
36e80 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
36e90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
36ea0 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
36eb0 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
36ec0 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
36ed0 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
36ee0 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
36ef0 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
36f00 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
36f10 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
36f20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
36f30 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
36f40 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
36f50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36f60 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
36f70 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
36f80 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
36f90 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
36fa0 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
36fb0 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
36fc0 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
36fd0 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
36fe0 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
36ff0 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
37000 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
37010 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
37020 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
37030 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
37040 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
37050 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
37060 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
37070 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
37080 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
37090 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
370a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
370b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
370c0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
370d0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
370e0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
370f0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
37100 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
37110 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
37120 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
37130 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
37140 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
37150 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
37160 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
37170 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
37180 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
37190 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
371a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
371b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
371c0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
371d0 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
371e0 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
371f0 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
37200 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
37210 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
37220 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
37230 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
37240 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
37250 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
37260 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
37270 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
37280 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
37290 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
372a0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
372b0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
372c0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
372d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
372e0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
372f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37300 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
37310 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
37320 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
37330 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
37340 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
37350 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
37360 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
37370 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
37380 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
37390 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
373a0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
373b0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
373c0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
373d0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
373e0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
373f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37400 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
37410 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b    if( nSrc>=n ){
37420 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
37430 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
37440 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37450 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
37460 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
37470 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
37480 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
37490 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
374a0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
374b0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
374c0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
374d0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30   if( nPayload<=0
374e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50   ) break;.    pP
374f0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
37500 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
37510 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
37520 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
37530 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
37540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  ==0 ){.      Mem
37550 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
37560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37570 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37580 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
37590 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
375a0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
375b0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
375c0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
375d0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
375e0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
375f0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
37600 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
37610 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
37620 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
37630 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
37640 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
37650 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37660 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
37670 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
37680 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
37690 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
376a0 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
376b0 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
376c0 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
376d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
376e0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
376f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
37700 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
37710 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
37720 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
37730 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
37740 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
37750 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
37760 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
37770 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
37780 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
37790 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
377a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
377b0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
377c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
377d0 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
377e0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
377f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
37800 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
37810 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
37820 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
37830 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
37840 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
37850 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
37860 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
37870 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
37880 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
37890 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
378a0 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
378b0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
378c0 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
378d0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
378e0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
378f0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
37900 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
37910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37920 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
37930 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
37940 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
37950 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
37960 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
37970 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
37980 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
37990 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
379a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
379b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
379c0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
379d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
379e0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
379f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
37a00 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
37a10 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
37a20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37a30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
37a40 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
37a50 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
37a60 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
37a70 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
37a80 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
37a90 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
37aa0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
37ab0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
37ac0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
37ad0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
37ae0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37af0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
37b00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
37b10 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
37b20 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
37b30 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
37b40 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
37b50 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
37b60 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
37b70 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
37b80 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
37b90 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
37ba0 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
37bb0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
37bc0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
37bd0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
37be0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37bf0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
37c00 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
37c10 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
37c20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37c30 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
37c40 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
37c50 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
37c60 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
37c70 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
37c80 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
37c90 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
37ca0 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
37cb0 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
37cc0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
37cd0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
37ce0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
37cf0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
37d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37d10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
37d20 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
37d30 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
37d40 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
37d50 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
37d60 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
37d70 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
37d80 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
37d90 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
37da0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
37db0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
37dc0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
37dd0 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
37de0 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
37df0 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
37e00 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
37e10 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
37e20 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
37e30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
37e40 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
37e50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37e60 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
37e70 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
37e80 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
37e90 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
37ea0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
37eb0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
37ec0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
37ed0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
37ee0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
37ef0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
37f00 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
37f10 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
37f20 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
37f30 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
37f40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
37f50 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
37f60 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
37f70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
37f80 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
37f90 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
37fa0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
37fb0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
37fc0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
37fd0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
37fe0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
37ff0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
38000 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
38010 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
38020 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
38030 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
38040 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
38050 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
38060 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38070 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
38080 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
38090 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
380a0 72 65 65 3e 3d 30 20 29 3b 0a 20 20 64 61 74 61  ree>=0 );.  data
380b0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
380c0 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
380d0 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
380e0 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
380f0 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
38100 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
38110 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
38120 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
38130 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
38140 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
38150 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38160 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
38170 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
38180 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
38190 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
381a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
381b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
381c0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
381d0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
381e0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
381f0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
38200 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
38210 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
38220 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
38230 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  l==0 ){.    mems
38240 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
38250 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61   0, 4);.    data
38260 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20  [hdr+7] = 0;.   
38270 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
38280 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70  hdr+5], pPage->p
38290 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
382a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
382b0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
382c0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61  usableSize - pPa
382d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20  ge->hdrOffset.  
382e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382f0 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68       - pPage->ch
38300 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a  ildPtrSize - 8;.
38310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
38320 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c  move(ptr, ptr+2,
38330 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   2*(pPage->nCell
38340 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75   - idx));.    pu
38350 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
38360 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
38370 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  l);.    pPage->n
38380 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d  Free += 2;.  }.}
38390 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
383a0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
383b0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
383c0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
383d0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
383e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
383f0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
38400 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
38410 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
38420 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
38430 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
38440 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
38450 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
38460 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
38470 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
38480 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
38490 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
384a0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
384b0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
384c0 79 0a 2a 2a 20 69 6e 20 70 50 61