/ Hex Artifact Content
Login

Artifact ef42df0cd8fa80ab174c83deb13a216465c49555eb01d57abdfd814a8546fa77:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20  Pgno pgnoRoot,  
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
4300: 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20  able that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4340: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4350: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4360: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4370: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4380: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
4390: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
43a0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
43b0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
43c0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
43d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
43e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
43f0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4400: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4410: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4420: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4430: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4440: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4450: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4460: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4470: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4480: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
4490: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
44a0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
44b0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f  ->pgnoRoot==pgno
44c0: 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72  Root && (isClear
44d0: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
44e0: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a  .nKey==iRow) ){.
44f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4500: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
4510: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
4520: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4530: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4540: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4550: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4560: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4570: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4580: 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  s(w,x,y,z).#endi
4590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
45a0: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
45b0: 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f  .** Set bit pgno
45c0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
45d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
45e0: 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c  vec. This is cal
45f0: 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70  led .** when a p
4600: 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75  age that previou
4610: 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61  sly contained da
4620: 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ta becomes a fre
4630: 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20  e-list leaf .** 
4640: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
4650: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4660: 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73  tent bitvec exis
4670: 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ts to work aroun
4680: 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20  d an obscure.** 
4690: 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68  bug caused by th
46a0: 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66  e interaction of
46b0: 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f   two useful IO o
46c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72  ptimizations sur
46d0: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65  rounding.** free
46e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
46f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
4700: 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65  n all data is de
4710: 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67  leted from a pag
4720: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  e and the page b
4730: 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61  ecomes.**      a
4740: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4750: 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69  page, the page i
4760: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
4770: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
4780: 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c        (as free-l
4790: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63  ist leaf pages c
47a0: 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e  ontain no meanin
47b0: 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65  gful data). Some
47c0: 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75  times.**      su
47d0: 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74  ch a page is not
47e0: 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64   even journalled
47f0: 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74   (as it will not
4800: 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   be modified,.**
4810: 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72        why bother
4820: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f   journalling it?
4830: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  )..**.**   2) Wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73  eaf page is reus
4860: 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ed, its content 
4870: 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20  is not read.**  
4880: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74      from the dat
4890: 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e  abase or written
48a0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
48b0: 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64  file (why should
48c0: 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20   it.**      be, 
48d0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
48e0: 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29  all meaningful?)
48f0: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73  ..**.** By thems
4900: 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74  elves, these opt
4910: 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20  imizations work 
4920: 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65  fine and provide
4930: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
4940: 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f  ormance boost to
4950: 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20   bulk delete or 
4960: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
4970: 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a  s. However, if.*
4980: 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  * a page is move
4990: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
49a0: 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73  st and then reus
49b0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ed within the sa
49c0: 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  me.** transactio
49d0: 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d  n, a problem com
49e0: 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61  es up. If the pa
49f0: 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61  ge is not journa
4a00: 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20  lled when.** it 
4a10: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4a20: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74  free-list and it
4a30: 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75   is also not jou
4a40: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a  rnalled when it.
4a50: 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ** is extracted 
4a60: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4a70: 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74  st and reused, t
4a80: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
4a90: 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20   data.** may be 
4aa0: 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65  lost. In the eve
4ab0: 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
4ac0: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
4ad0: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72  possible.** to r
4ae0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4af0: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
4b00: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
4b10: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c  n..**.** The sol
4b20: 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53  ution is the BtS
4b30: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4b40: 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  t bitvec. Whenev
4b50: 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a  er a page is .**
4b60: 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65   moved to become
4b70: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4b80: 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72  f page, the corr
4b90: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
4ba0: 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62  .** set in the b
4bb0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4bc0: 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65  a leaf page is e
4bd0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
4be0: 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20  e free-list,.** 
4bf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61  optimization 2 a
4c00: 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20  bove is omitted 
4c10: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4c20: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4c30: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4c40: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4c50: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4c60: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4c70: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4c80: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
4c90: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
4ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4cb0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
4cc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4cd0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
4ce0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4cf0: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4d00: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4d10: 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42  assert( pgno<=pB
4d20: 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  t->nPage );.    
4d30: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4d50: 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67  Create(pBt->nPag
4d60: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74  e);.    if( !pBt
4d70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4d90: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
4da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
4db0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4dc0: 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74  pgno<=sqlite3Bit
4dd0: 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61  vecSize(pBt->pHa
4de0: 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20  sContent) ){.   
4df0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
4e00: 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73  vecSet(pBt->pHas
4e10: 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a  Content, pgno);.
4e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
4e40: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e50: 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e  sContent vector.
4e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4e70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
4e80: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
4e90: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d  leaf page is rem
4ea0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  oved from the.**
4eb0: 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72   free-list for r
4ec0: 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  euse. It returns
4ed0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
4ee0: 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65  safe to retrieve
4ef0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f   the.** page fro
4f00: 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
4f10: 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
4f20: 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
4f30: 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65  . True otherwise
4f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f50: 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
4f60: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4f70: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4f80: 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d  Bitvec *p = pBt-
4f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20  >pHasContent;.  
4fa0: 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67  return (p && (pg
4fb0: 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63  no>sqlite3Bitvec
4fc0: 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74  Size(p) || sqlit
4fd0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20  e3BitvecTest(p, 
4fe0: 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pgno)));.}../*.*
4ff0: 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79  * Clear (destroy
5000: 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  ) the BtShared.p
5010: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
5020: 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  c. This should b
5030: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20  e.** invoked at 
5040: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
5050: 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61  f each write-tra
5060: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
5070: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c  tic void btreeCl
5080: 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  earHasContent(Bt
5090: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
50a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
50b0: 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f  troy(pBt->pHasCo
50c0: 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70  ntent);.  pBt->p
50d0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a  HasContent = 0;.
50e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
50f0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61   all of the apPa
5100: 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61  ge[] pages for a
5110: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
5120: 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c  ic void btreeRel
5130: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5140: 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  es(BtCursor *pCu
5150: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
5170: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
5180: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
5190: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
51a0: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
51b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  [i] = 0;.  }.  p
51c0: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
51d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
51e0: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
51f0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5200: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5210: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5220: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
5230: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
5240: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
5250: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
5260: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5270: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
5280: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5290: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
52a0: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
52b0: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
52c0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
52d0: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
52e0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
52f0: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5300: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5310: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5320: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
5330: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
5340: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
5350: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
5360: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
5370: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
5380: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5390: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
53a0: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
53b0: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
53c0: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
53d0: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
53e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
53f0: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5400: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5410: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5420: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
5430: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
5440: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
5450: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5470: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
5480: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5490: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
54a0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
54b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
54c0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
54d0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
54e0: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
54f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5500: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5510: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5520: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5530: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5540: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5550: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5560: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5570: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5580: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5590: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
55a0: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
55b0: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
55c0: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
55d0: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
55e0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
55f0: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5600: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5610: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5620: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5630: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5640: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5650: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5670: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5680: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
56a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
56b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
56c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
56d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
56e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
56f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5700: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5710: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5720: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5730: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5740: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5750: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5760: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5770: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5780: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5790: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
57a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
57b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
57c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
57d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
57e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
57f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5800: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5810: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5820: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5830: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5840: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5850: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5860: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5870: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5880: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5890: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
58a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
58b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
58c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
58d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
58e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
58f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5900: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5910: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5920: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5930: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5940: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5950: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5960: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5970: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5980: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5990: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
59a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
59b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
59c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
59d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
59e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
59f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5a00: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5a10: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5a20: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5a30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5a40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5a50: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5a60: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5a70: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5a80: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5a90: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5aa0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5ab0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5ac0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5ad0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5ae0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5af0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5b00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5b10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5b20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5b30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5b40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5b50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5b60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5b70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5b80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5b90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5ba0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5bb0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5bc0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5bd0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5be0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5bf0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5c00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5c10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5c20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5c30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5c40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5c50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5c60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5c70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5c80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5c90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ca0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5cb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5cc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5cd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5ce0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5cf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5d00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5d10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5d20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5d30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5d40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5d50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5d60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5d70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5d80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5d90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5da0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5db0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5dc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5dd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5de0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5df0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5e00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5e10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5e20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5e40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5e50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5e60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5e70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5e80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5e90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5ea0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5eb0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5ec0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5ed0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5ef0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5f00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5f10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5f20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5f30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5f40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5f50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5f60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5f70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5f80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5f90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5fa0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5fb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5fc0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5fd0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5fe0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ff0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6000: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6010: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6020: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
6030: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
6040: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
6050: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
6060: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
6070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6080: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6090: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
60a0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
60b0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
60c0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
60d0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
60e0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
60f0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6100: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6110: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6120: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6130: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6140: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6160: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6170: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6180: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6190: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
61a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
61b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
61c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
61d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
61e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
61f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6200: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6210: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6220: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6230: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6240: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6250: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6260: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6270: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6280: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6290: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
62a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
62b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
62c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
62d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
62e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6310: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6320: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6330: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6340: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6350: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6360: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6370: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
63a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
63b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
63c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
63d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
63e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
63f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6400: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6420: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6430: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6440: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6450: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6460: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6470: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6480: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6490: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
64a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
64b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
64c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
64d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
64e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
64f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6500: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6510: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6520: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6530: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6540: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6550: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6560: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6570: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6580: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6590: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
65a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
65b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
65c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
65d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
65e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
65f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6600: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6610: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6620: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6630: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6640: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6650: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6670: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6680: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6690: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
66a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
66b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
66c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
66d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
66e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
66f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6700: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6740: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6750: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6760: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6770: 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20  x key */..  if( 
6780: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
6790: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
67a0: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
67b0: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
67c0: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
67d0: 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70  edRecord(pCur->p
67e0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
67f0: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
6800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c  EM_BKPT;.    sql
6820: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
6830: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
6840: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
6850: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
6860: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
6870: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
6880: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6890: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
68a0: 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
68b0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  done;.    }.  }e
68c0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
68d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
68e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
68f0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
6900: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
6910: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f   bias, pRes);.mo
6920: 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28  veto_done:.  if(
6930: 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
6940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6950: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6960: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
6970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6980: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6990: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
69a0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
69b0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
69c0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
69d0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
69e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
69f0: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6a00: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6a10: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6a20: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6a30: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6a40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6a50: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6a60: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6a70: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6a80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a90: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
6aa0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
6ab0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
6ac0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
6ad0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6ae0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
6af0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
6b00: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
6b10: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6b20: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
6b30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
6b40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
6b50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6b60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
6b70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
6b80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
6b90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
6ba0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
6bb0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6bc0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
6bd0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
6be0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
6bf0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69  r->nKey, 0, &ski
6c00: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
6c10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6c20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6c30: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
6c40: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6c50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
6c60: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c70: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
6c80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6c90: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70  INVALID );.    p
6ca0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d  Cur->skipNext |=
6cb0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
6cc0: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
6cd0: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
6ce0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
6cf0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
6d00: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
6d10: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
6d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6d30: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
6d40: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d50: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
6d60: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6d70: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
6d80: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
6d90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
6da0: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
6db0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
6dc0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
6dd0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
6de0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
6df0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
6e00: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
6e10: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
6e20: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
6e30: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
6e40: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
6e50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
6e60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
6e70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
6e80: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
6e90: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
6ea0: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
6eb0: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
6ec0: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
6ed0: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
6ee0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
6ef0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
6f00: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
6f10: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
6f20: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
6f30: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
6f40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f50: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
6f60: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
6f70: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
6f80: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
6f90: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
6fa0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6fb0: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
6fc0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6fd0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
6fe0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
6ff0: 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  rn pCur->eState!
7000: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7020: 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20  tine restores a 
7030: 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69  cursor back to i
7040: 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69  ts original posi
7050: 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a  tion after it.**
7060: 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20   has been moved 
7070: 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20  by some outside 
7080: 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61  activity (such a
7090: 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61  s a btree rebala
70a0: 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20  nce or.** a row 
70b0: 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65  having been dele
70c0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
70d0: 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20  er the cursor). 
70e0: 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65   .**.** On succe
70f0: 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72  ss, the *pDiffer
7100: 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72  entRow parameter
7110: 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
7120: 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a   cursor is left.
7130: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65  ** pointing at e
7140: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
7150: 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74  row.  *pDiffernt
7160: 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74  Row is the row t
7170: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
7180: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73   pointing to has
7190: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66   been deleted, f
71a0: 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f  orcing the curso
71b0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f  r to point to so
71c0: 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77  me.** nearby row
71d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
71e0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
71f0: 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   be called for a
7200: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73   cursor that jus
7210: 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52  t returned.** TR
7220: 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  UE from sqlite3B
7230: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7240: 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ed()..*/.int sql
7250: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
7260: 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20  estore(BtCursor 
7270: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66  *pCur, int *pDif
7280: 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e  ferentRow){.  in
7290: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
72a0: 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73   pCur!=0 );.  as
72b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
72c0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
72d0: 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
72e0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
72f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
7300: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
7310: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  entRow = 1;.    
7320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7330: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
7340: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7360: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c  ntRow = 1;.  }el
7370: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7380: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
7390: 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65  0 );.    *pDiffe
73a0: 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d  rentRow = 0;.  }
73b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
73c0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
73d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
73e0: 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
73f0: 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f  Provide hints to
7400: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
7410: 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e  e particular hin
7420: 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65  t given (and the
7430: 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d   type.** and num
7440: 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72  ber of the varar
7450: 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69  gs parameters) i
7460: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7470: 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a  the eHintType.**
7480: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65   parameter.  See
7490: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
74a0: 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49   of the BTREE_HI
74b0: 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20  NT_* macros for 
74c0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64  details..*/.void
74d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
74e0: 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72  sorHint(BtCursor
74f0: 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e   *pCur, int eHin
7500: 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f  tType, ...){.  /
7510: 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  * Used only by s
7520: 79 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74  ystem that subst
7530: 69 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20  itute their own 
7540: 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a  storage engine *
7550: 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.}.#endif../*.*
7560: 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68  * Provide flag h
7570: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
7580: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
7590: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
75a0: 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  ntFlags(BtCursor
75b0: 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64   *pCur, unsigned
75c0: 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78   x){.  assert( x
75d0: 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
75e0: 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b  || x==BTREE_BULK
75f0: 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a  LOAD || x==0 );.
7600: 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20    pCur->hints = 
7610: 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  x;.}...#ifndef S
7620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7630: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
7640: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
7650: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
7660: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
7670: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
7680: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
7690: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
76a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
76b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
76c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
76d0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
76e0: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
76f0: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
7700: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
7710: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
7720: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
7730: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
7740: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
7750: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
7760: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
7770: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
7780: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
7790: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
77a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
77b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
77c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
77d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
77e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
77f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7810: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
7820: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
7830: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
7840: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
7850: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
7860: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
7870: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
7880: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
7890: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
78a0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
78b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
78c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
78d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
78e0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
78f0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7900: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7910: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7920: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
7930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
7950: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
7960: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
7970: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
7980: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7990: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
79a0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
79b0: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
79c0: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
79d0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
79e0: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
79f0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7a00: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7a10: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7a20: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7a30: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7a40: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
7a50: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
7a60: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
7a70: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
7a80: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
7a90: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7ac0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7ad0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7ae0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7af0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7b00: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7b10: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7b20: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7b30: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7b40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
7b50: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
7b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7b70: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7b80: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
7b90: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
7ba0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7bc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7bd0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7be0: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7bf0: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7c00: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7c10: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7c20: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7c30: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7c40: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
7c50: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
7c60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
7c70: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
7c80: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
7c90: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
7ca0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7cb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7cc0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7cd0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7ce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7cf0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7d00: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7d10: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
7d20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7d30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
7d40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7d60: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7d70: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7d80: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7d90: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7da0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7db0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
7dc0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
7dd0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
7de0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
7df0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
7e00: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
7e10: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
7e20: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
7e30: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
7e40: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
7e50: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7e60: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7e70: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7e80: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7e90: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7ea0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7eb0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
7ec0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7ed0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
7ee0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ef0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7f00: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
7f10: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
7f20: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7f30: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
7f40: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
7f50: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
7f60: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7f70: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
7f80: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
7f90: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7fb0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
7fc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7fd0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
7fe0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
7ff0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8000: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8010: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8020: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
8030: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
8040: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8050: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
8060: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
8070: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
8080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8090: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
80a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
80b0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
80c0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
80d0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
80e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
80f0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
8100: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
8110: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8120: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
8130: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
8140: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8150: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
8160: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
8170: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
8180: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8190: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
81a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
81b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
81c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
81d0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
81e0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
81f0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
8200: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
8210: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
8220: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
8230: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8240: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8250: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
8260: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8270: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8280: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
8290: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
82a0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
82b0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
82c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
82d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
82e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
82f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8300: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
8310: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
8320: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
8330: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
8340: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
8350: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
8360: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
8370: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
8380: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8390: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
83a0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
83b0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
83c0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
83d0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
83e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
83f0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
8400: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8410: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8430: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8440: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8450: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8460: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8470: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8480: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8490: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
84a0: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
84b0: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
84c0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
84d0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
84e0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
84f0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
8500: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
8510: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
8520: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
8530: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8540: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
8550: 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73  *.** findCellPas
8560: 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20  tPtr() does the 
8570: 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73  same except it s
8580: 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e  kips past the in
8590: 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20  itial.** 4-byte 
85a0: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f  child pointer fo
85b0: 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20  und on interior 
85c0: 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20  pages, if there 
85d0: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  is one..**.** Th
85e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
85f0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
8600: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
8610: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
8620: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
8630: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
8640: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
8690: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
86a0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
86b0: 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29  aDataOfst + ((P)
86c0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
86d0: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
86e0: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
86f0: 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  )]))).../*.** Th
8700: 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69  is is common tai
8710: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
8720: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8730: 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65  tr() and.** btre
8740: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8750: 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73  ex() for the cas
8760: 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  e when the cell 
8770: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74  does not fit ent
8780: 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69  irely.** on a si
8790: 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65  ngle B-tree page
87a0: 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72  .  Make necessar
87b0: 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  y adjustments to
87c0: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a   the CellInfo.**
87d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
87e0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87f0: 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65  NLINE void btree
8800: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
8810: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a  izeForOverflow(.
8820: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8830: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8840: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8850: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8860: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8870: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8880: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8890: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
88a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
88b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
88c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f  ucture */.){.  /
88d0: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
88e0: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
88f0: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
8900: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
8910: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69  ave.  ** to deci
8920: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
8930: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
8940: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
8950: 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65  ll onto.  ** ove
8960: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
8970: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
8980: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
8990: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
89a0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
89b0: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
89c0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
89d0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
89e0: 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65  orage.  ** in be
89f0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
8a00: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a  nd maxLocal..  *
8a10: 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20  *.  ** Warning: 
8a20: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8a30: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8a40: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8a50: 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61  d in any.  ** wa
8a60: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
8a70: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
8a80: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
8a90: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
8aa0: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
8ab0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8ac0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ad0: 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b  .  int maxLocal;
8ae0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8af0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8b00: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8b10: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
8b20: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
8b30: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
8b40: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
8b50: 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  */..  minLocal =
8b60: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8b70: 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ;.  maxLocal = p
8b80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
8b90: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8ba0: 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e  ocal + (pInfo->n
8bb0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
8bc0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
8bd0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a  >usableSize-4);.
8be0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8bf0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8c00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
8c10: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
8c20: 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75   );.  if( surplu
8c30: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
8c40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
8c50: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
8c60: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8c80: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
8c90: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   }.  pInfo->nSiz
8ca0: 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  e = (u16)(&pInfo
8cb0: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8cc0: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8cd0: 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l) + 4;.}../*.**
8ce0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
8cf0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
8d00: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
8d10: 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73  he MemPage.xPars
8d20: 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f  eCell().** metho
8d30: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61  d..**.** Parse a
8d40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
8d50: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
8d60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
8d70: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74  ucture..**.** bt
8d80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8d90: 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61  )        =>   ta
8da0: 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e  ble btree leaf n
8db0: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8dc0: 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28  seCellNoPayload(
8dd0: 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74  )  =>   table bt
8de0: 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ree internal nod
8df0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8e00: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20  CellPtrIndex()  
8e10: 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65   =>   index btre
8e20: 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68  e nodes.**.** Th
8e30: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72  ere is also a wr
8e40: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62  apper function b
8e50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
8e60: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
8e70: 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79  * all MemPage ty
8e80: 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66  pes and that ref
8e90: 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c  erences the cell
8ea0: 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72   by index rather
8eb0: 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e   than.** by poin
8ec0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
8ed0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
8ee0: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a  llPtrNoPayload(.
8ef0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8f00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8f10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8f20: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8f30: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8f40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8f50: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8f60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8f70: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8f80: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8f90: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  ucture */.){.  a
8fa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8fb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8fc0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8fd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8fe0: 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  >leaf==0 );.  as
8ff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9000: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
9010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9020: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9030: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
9040: 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e  #endif.  pInfo->
9050: 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56  nSize = 4 + getV
9060: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
9070: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9080: 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  Key);.  pInfo->n
9090: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70  Payload = 0;.  p
90a0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
90b0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
90c0: 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  oad = 0;.  retur
90d0: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n;.}.static void
90e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
90f0: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
9100: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9110: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9120: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9130: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9140: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9150: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9160: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9170: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9180: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9190: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
91a0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
91b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
91c0: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
91d0: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
91e0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
91f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9200: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
9210: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36   payload */.  u6
9220: 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  4 iKey;         
9230: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
9240: 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  ed Key value */.
9250: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9260: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9270: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9290: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
92a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
92b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
92c0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
92d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
92f0: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
9300: 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cell;..  /* The 
9310: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9320: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9330: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9340: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9350: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
9360: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20  Payload);.  **. 
9370: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9380: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9390: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
93a0: 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  ..  */.  nPayloa
93b0: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
93c0: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
93d0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
93e0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
93f0: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
9400: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
9410: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
9420: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
9430: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9440: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49      }while( (*pI
9450: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
9460: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
9470: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a    pIter++;..  /*
9480: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9490: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
94a0: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
94b0: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
94c0: 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72   getVarint(pIter
94d0: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
94e0: 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  nKey);.  **.  **
94f0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
9500: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
9510: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
9520: 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49   */.  iKey = *pI
9530: 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e  ter;.  if( iKey>
9540: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
9550: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37  *pEnd = &pIter[7
9560: 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30  ];.    iKey &= 0
9570: 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31  x7f;.    while(1
9580: 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  ){.      iKey = 
9590: 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b  (iKey<<7) | (*++
95a0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
95b0: 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72       if( (*pIter
95c0: 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a  )<0x80 ) break;.
95d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e        if( pIter>
95e0: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
95f0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38   iKey = (iKey<<8
9600: 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20  ) | *++pIter;.  
9610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9630: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e   pIter++;..  pIn
9640: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34  fo->nKey = *(i64
9650: 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f  *)&iKey;.  pInfo
9660: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9670: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9680: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
9690: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
96a0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
96b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
96c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
96d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
96e0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
96f0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9710: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9720: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9730: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9740: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9750: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9760: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9770: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
9780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
9790: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
97a0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
97b0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
97c0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
97d0: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
97e0: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
97f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9800: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
9810: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9820: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9830: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9840: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9850: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9860: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9870: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
9880: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9890: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
98a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98b0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98e0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98f0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9900: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9910: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9920: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9930: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9940: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9950: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9960: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9970: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
9980: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9990: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
99a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
99b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
99c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
99d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
99e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
99f0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9a00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9a10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9a20: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9a30: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
9a40: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
9a50: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9a60: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
9a70: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
9a80: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9a90: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
9aa0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
9ab0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
9ac0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
9ad0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ae0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
9af0: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
9b00: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9b10: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9b20: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ;.  pInfo->nKey 
9b30: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b40: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9b50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9b60: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9b70: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9b80: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9b90: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9ba0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9bb0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9bc0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9bd0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9be0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9bf0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9c00: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9c10: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9c20: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9c30: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9c40: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9c50: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9c60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9c70: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9c80: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9c90: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9ca0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9cb0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9cc0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9cd0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ce0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9cf0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9d00: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9d10: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9d20: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9d30: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9d40: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9d50: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
9d60: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9d70: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9d80: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9d90: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9db0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
9dc0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
9dd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9de0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9df0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9e00: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
9e10: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
9e20: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
9e30: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
9e40: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
9e50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
9e60: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
9e70: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
9e80: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
9e90: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
9ea0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
9eb0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
9ec0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
9ed0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
9ee0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
9ef0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
9f00: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
9f10: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
9f20: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
9f30: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
9f40: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
9f50: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
9f60: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
9f70: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
9f80: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9f90: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
9fa0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
9fb0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
9fc0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
9fd0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
9fe0: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
9ff0: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
a000: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
a010: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
a020: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
a030: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
a040: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
a050: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
a060: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a070: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
a080: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
a090: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
a0a0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a0d0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
a0e0: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a110: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
a120: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
a130: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
a140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
a150: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a160: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
a170: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
a180: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
a190: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
a1a0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
a1b0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
a1c0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
a1d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
a1e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
a1f0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
a200: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
a210: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
a220: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
a230: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
a240: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
a250: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
a260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a280: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
a290: 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20  #endif..  nSize 
a2a0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
a2b0: 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20  nSize>=0x80 ){. 
a2c0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a2d0: 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26  [8];.    nSize &
a2e0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
a2f0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e        nSize = (n
a300: 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  Size<<7) | (*++p
a310: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
a320: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
a330: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
a340: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
a350: 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70  pIter++;.  if( p
a360: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
a370: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
a380: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
a390: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
a3a0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
a3b0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
a3c0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
a3d0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
a3e0: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
a3f0: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
a400: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
a410: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
a420: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
a430: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a440: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
a450: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
a460: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
a470: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
a480: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a490: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
a4a0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a4c0: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   );.  if( nSize<
a4d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a4e0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d   ){.    nSize +=
a4f0: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
a500: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Cell);.    if( n
a510: 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d  Size<4 ) nSize =
a520: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
a530: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
a540: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
a550: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
a560: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
a570: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
a580: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a590: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
a5a0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a5b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a5c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a5d0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a5e0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
a5f0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
a600: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a610: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a620: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
a630: 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31  nSize += 4 + (u1
a640: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
a650: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a660: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
a670: 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  o.nSize || CORRU
a680: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a690: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
a6a0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
a6b0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a6d0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
a6e0: 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20   *pIter = pCell 
a6f0: 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  + 4; /* For loop
a700: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a710: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a720: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a730: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a740: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a760: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a770: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a780: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a790: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a7a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a800: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a810: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a820: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a830: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a840: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a850: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a860: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a870: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a880: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a890: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a8a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65  ebuginfo);.#else
a8c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a8d0: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
a8e0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
a8f0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a900: 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d  e==4 );.  pEnd =
a910: 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68   pIter + 9;.  wh
a920: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
a930: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a940: 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nd );.  assert( 
a950: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d  debuginfo.nSize=
a960: 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70  =(u16)(pIter - p
a970: 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
a980: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a990: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a9a0: 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ell);.}...#ifdef
a9b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
a9c0: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
a9d0: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
a9e0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
a9f0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
aa00: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
aa10: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
aa20: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
aa30: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
aa40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
aa50: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
aa60: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
aa70: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
aa80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
aa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
aaa0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
aab0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
aac0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
aad0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
aae0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
aaf0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
ab00: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
ab10: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
ab20: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
ab30: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
ab40: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
ab50: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
ab60: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
ab70: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
ab80: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
ab90: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
aba0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
abb0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
abc0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
abd0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
abe0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
abf0: 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
ac00: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50  Payload ){.    P
ac10: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
ac20: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ac30: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
ac40: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
ac50: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
ac60: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
ac70: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
ac80: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
ac90: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
aca0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
acb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
acc0: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
acd0: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
ace0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
acf0: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
ad00: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
ad10: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
ad20: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
ad30: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
ad40: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
ad50: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
ad60: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
ad70: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
ad80: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
ad90: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
ada0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
adb0: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
adc0: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
add0: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ade0: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
adf0: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
ae00: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
ae10: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
ae20: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
ae30: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ae40: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
ae50: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ae60: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ae70: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ae80: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ae90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
aea0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
aeb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
aec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
aed0: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
aee0: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
af10: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
af40: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
af50: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
af80: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
af90: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
afa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
afb0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
afc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
afd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
afe0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
aff0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
b000: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
b010: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
b020: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b030: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b040: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
b050: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
b060: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
b070: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
b080: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
b090: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
b0a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b0b0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
b0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
b0d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b0f0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
b100: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
b110: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
b120: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
b130: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
b140: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
b150: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
b160: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
b170: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
b180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b190: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b1a0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
b1b0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
b1d0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
b1e0: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
b1f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b200: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b210: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b220: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b230: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
b240: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
b250: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
b260: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b270: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
b280: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
b290: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b2b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b2c0: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
b2d0: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
b2e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b2f0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
b300: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
b310: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
b320: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
b330: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
b340: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
b350: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
b360: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
b370: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
b380: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
b390: 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69  Cell;.  usableSi
b3a0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
b3b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
b3c0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  /* This block ha
b3d0: 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68  ndles pages with
b3e0: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72   two or fewer fr
b3f0: 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d  ee blocks and nM
b400: 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66  axFrag.  ** or f
b410: 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20  ewer fragmented 
b420: 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  bytes. In this c
b430: 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72  ase it is faster
b440: 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a   to move the.  *
b450: 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62  * two (or one) b
b460: 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75  locks of cells u
b470: 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61  sing memmove() a
b480: 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69  nd add the requi
b490: 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73  red.  ** offsets
b4a0: 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72   to each pointer
b4b0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
b4c0: 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20  nter array than 
b4d0: 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72  it is to .  ** r
b4e0: 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65  econstruct the e
b4f0: 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a  ntire page.  */.
b500: 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b    if( (int)data[
b510: 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67  hdr+7]<=nMaxFrag
b520: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65   ){.    int iFre
b530: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
b540: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
b550: 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20  if( iFree ){.   
b560: 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20     int iFree2 = 
b570: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
b580: 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  Free]);..      /
b590: 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29  * pageFindSlot()
b5a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72   has already ver
b5b0: 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20  ified that free 
b5c0: 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65  blocks are sorte
b5d0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72  d.      ** in or
b5e0: 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69  der of offset wi
b5f0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61  thin the page, a
b600: 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b  nd that no block
b610: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a   extends.      *
b620: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
b630: 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76  f the page. Prov
b640: 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65  ided the two fre
b650: 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a  e slots do not .
b660: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70        ** overlap
b670: 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  , this guarantee
b680: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f  s that the memmo
b690: 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77  ve() calls below
b6a0: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20   will not.      
b6b0: 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ** overwrite the
b6c0: 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65   usableSize byte
b6d0: 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66   buffer, even if
b6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
b6f0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  ge.      ** is c
b700: 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20  orrupt.  */.    
b710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
b720: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46  ==0 || iFree2>iF
b730: 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ree );.      ass
b740: 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62  ert( iFree+get2b
b750: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
b760: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
b770: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b780: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
b790: 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28  iFree2+get2byte(
b7a0: 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29  &data[iFree2+2])
b7b0: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b7c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
b7d0: 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b  iFree2 || (data[
b7e0: 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61  iFree2]==0 && da
b7f0: 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29  ta[iFree2+1]==0)
b800: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
b810: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
b820: 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
b830: 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  2];.        u8 *
b840: 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69  pAddr;.        i
b850: 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20  nt sz2 = 0;.    
b860: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
b870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b880: 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e+2]);.        i
b890: 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  nt top = get2byt
b8a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
b8c0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
b8d0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
b8e0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
b8f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b900: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  T;.          sz2
b910: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b920: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
b930: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b940: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
b950: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
b960: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
b970: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
b980: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
b990: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
b9a0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
b9b0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
b9c0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
b9d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b9e0: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
b9f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ba00: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
ba10: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
ba20: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
ba30: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
ba40: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
ba50: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
ba60: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
ba70: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
ba80: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
ba90: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
baa0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
bab0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
bac0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
bad0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
bae0: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
baf0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
bb00: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
bb10: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
bb20: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
bb30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
bb40: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
bb50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
bb60: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
bb70: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
bb80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
bb90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
bba0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
bbb0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
bbc0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
bbd0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
bbe0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
bbf0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
bc00: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
bc10: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
bc20: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc30: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
bc40: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc50: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
bc60: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
bc70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
bc80: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
bc90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
bca0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
bcb0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
bcc0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
bcd0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
bce0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
bcf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bd00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bd10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
bd20: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
bd30: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
bd40: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
bd50: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
bd60: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
bd70: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
bd80: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
bd90: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
bda0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
bdb0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bdc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bdd0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bde0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
bdf0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
be00: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
be10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
be20: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
be30: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
be40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
be50: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
be70: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
be80: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
be90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
bea0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
beb0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
bec0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
bed0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
bee0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
bef0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
bf00: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
bf10: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bf20: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
bf30: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
bf40: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
bf50: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
bf60: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
bf70: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
bf80: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
bf90: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
bfa0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
bfb0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
bfc0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
bfd0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
bfe0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c000: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c010: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
c020: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c030: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c040: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
c050: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
c060: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
c070: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
c080: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
c090: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
c0a0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
c0b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c0c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c0d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
c0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c0f0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
c100: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
c110: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
c120: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
c130: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
c140: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
c150: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
c160: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c170: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
c180: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
c190: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
c1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
c1b0: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
c1c0: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
c1d0: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
c1e0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
c1f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
c200: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
c210: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
c220: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
c230: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
c240: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
c250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c260: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c270: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
c280: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
c290: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
c2a0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
c2b0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
c2c0: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
c2d0: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
c2e0: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
c2f0: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
c300: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
c310: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
c320: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
c330: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
c340: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
c350: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
c360: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
c370: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
c380: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
c390: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
c3a0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
c3b0: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
c3c0: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
c3d0: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
c3e0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
c3f0: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
c400: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
c410: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
c420: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
c430: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
c440: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
c450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c460: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
c470: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
c480: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
c490: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
c4a0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
c4b0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
c4c0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
c4d0: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
c4e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
c4f0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
c500: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
c510: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
c520: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c530: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c540: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
c550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
c560: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
c570: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
c580: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
c590: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
c5a0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
c5b0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c5c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
c5d0: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
c5e0: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
c5f0: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
c600: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
c610: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
c620: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c630: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
c640: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
c650: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
c660: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
c670: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
c680: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
c690: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
c6a0: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
c6b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
c6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
c6d0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
c6e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
c6f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c700: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
c710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
c720: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
c730: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
c740: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
c750: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
c760: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
c770: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
c780: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
c790: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
c7a0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
c7b0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
c7c0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
c7d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
c7e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c7f0: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
c800: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
c810: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
c820: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
c830: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
c840: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
c850: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
c860: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
c870: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
c880: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
c890: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
c8a0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
c8b0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
c8c0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
c8d0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
c8e0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
c8f0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
c900: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
c910: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
c920: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
c930: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
c940: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
c950: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
c960: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
c970: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
c980: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
c990: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
c9a0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
c9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
c9c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
c9d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
c9e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
c9f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
ca00: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
ca10: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
ca20: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
ca30: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
ca40: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
ca50: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
ca60: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
ca70: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
ca80: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
ca90: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
caa0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
cab0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
cac0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
cad0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
cae0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
caf0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
cb00: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
cb10: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
cb20: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
cb30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
cb40: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
cb50: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
cb60: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
cb70: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
cb80: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
cb90: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
cba0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
cbb0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
cbc0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
cbd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
cbe0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
cbf0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
cc00: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
cc10: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
cc20: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
cc30: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
cc40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
cc50: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
cc60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
cc70: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
cc80: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc90: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
cca0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
ccb0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ccc0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
ccd0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
cce0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ccf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
cd00: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
cd10: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
cd20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd40: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
cd50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cd60: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
cd70: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cd90: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
cda0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cdc0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
cdd0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
cde0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
cdf0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
ce00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ce10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ce20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ce30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ce40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
ce50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ce60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ce70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
ce80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
ce90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
cea0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
ceb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cec0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
ced0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cee0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
cef0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
cf00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
cf10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
cf20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
cf30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
cf40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
cf50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
cf60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
cf70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
cf80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
cf90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
cfa0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
cfb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
cfc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
cfd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
cfe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
cff0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d000: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d010: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d020: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d030: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d040: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d050: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d060: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d070: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d080: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d090: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d0a0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d0b0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d0c0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
d0d0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
d0e0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
d0f0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
d100: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
d110: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d120: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
d130: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d140: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
d150: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
d160: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
d170: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
d180: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
d190: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
d1a0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
d1b0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
d1c0: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
d1d0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d1f0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
d200: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
d210: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
d220: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
d230: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
d240: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
d250: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
d260: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
d270: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
d280: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
d290: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
d2a0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
d2b0: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
d2c0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
d2d0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
d2e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
d2f0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
d300: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
d310: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d320: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
d330: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
d340: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
d350: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
d360: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
d370: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
d380: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
d390: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
d3a0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
d3b0: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
d3c0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
d3d0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
d3e0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
d3f0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
d400: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
d410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d420: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
d430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d450: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
d460: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
d470: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
d480: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
d490: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
d4a0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
d4b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
d4c0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
d4d0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
d4e0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
d4f0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
d500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d510: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
d520: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
d530: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
d540: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
d550: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
d560: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
d570: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d580: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
d590: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
d5a0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
d5b0: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
d5c0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
d5d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
d5e0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
d5f0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
d600: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d610: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
d620: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d630: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
d640: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
d650: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
d660: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
d670: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
d680: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
d690: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
d6a0: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
d6b0: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
d6c0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
d6d0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
d6e0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
d6f0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
d700: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
d710: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
d720: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
d730: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
d740: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
d750: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
d760: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
d770: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
d780: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
d790: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
d7a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d7b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d7c0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
d7d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
d7e0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
d7f0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
d800: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
d810: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
d820: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
d830: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
d840: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
d850: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d860: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
d870: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
d880: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
d890: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
d8a0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
d8b0: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
d8c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d8d0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
d8e0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
d8f0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
d900: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
d910: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
d920: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
d930: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
d940: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d950: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d960: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d970: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d980: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d990: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d9a0: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d9b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d9c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d9d0: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d9e0: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d9f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
da00: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
da10: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
da20: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
da30: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
da60: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
da70: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
da80: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
da90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
daa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
dab0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
dac0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
dad0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
db00: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
db10: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
db20: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
db50: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
db60: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
db70: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
db80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
db90: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
dba0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
dbb0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
dbc0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
dbd0: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
dbe0: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
dbf0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
dc00: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
dc10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
dc20: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
dc30: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
dc40: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
dc50: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
dc60: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
dc70: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
dc80: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
dc90: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
dca0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dcb0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
dcc0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
dcd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
dce0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
dcf0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
dd00: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
dd10: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
dd20: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
dd30: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
dd40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
dd50: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
dd60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dd70: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
dd80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
dd90: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
dda0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
ddb0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
ddc0: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
ddd0: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
dde0: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
ddf0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
de00: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
de10: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
de20: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
de30: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
de40: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
de50: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
de60: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
de70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
de80: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
de90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
dea0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
deb0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
dec0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
ded0: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
dee0: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
def0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
df00: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
df10: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
df20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
df30: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
df40: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
df50: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
df60: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
df70: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
df80: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
df90: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
dfa0: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
dfb0: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
dfc0: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
dfd0: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
dfe0: 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61  ata[iPtr]))<iSta
dff0: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
e000: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
e010: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
e020: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65  FreeBlk==0 ) bre
e030: 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ak;.        retu
e040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
e060: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e070: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e080: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
e090: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
e0a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e0b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
e0c0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
e0d0: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
e0e0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
e0f0: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
e100: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
e110: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
e120: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
e130: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
e140: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
e150: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
e160: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
e170: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
e180: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
e190: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
e1a0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
e1b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e1c0: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
e1d0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e1e0: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
e1f0: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
e200: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
e210: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
e220: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e250: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
e260: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
e270: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
e280: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
e290: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
e2a0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
e2b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e2c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
e2d0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
e2e0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
e2f0: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e300: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
e310: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e320: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
e330: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
e340: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
e350: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
e360: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
e370: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
e380: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
e390: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
e3a0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
e3b0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
e3c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
e3d0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
e3e0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
e3f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
e400: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
e410: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
e420: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e430: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
e440: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e450: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
e460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e470: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e480: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
e490: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
e4a0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
e4b0: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
e4c0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
e4d0: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
e4e0: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
e4f0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
e500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e510: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
e520: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
e530: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
e540: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
e550: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
e560: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
e570: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
e580: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e590: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e5a0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
e5b0: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
e5c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e5d0: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
e5e0: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
e5f0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
e600: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
e610: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
e620: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e630: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
e640: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e650: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
e660: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e670: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
e680: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e690: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
e6a0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
e6b0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
e6c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e6d0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
e6e0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e6f0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
e700: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e710: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e720: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
e730: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
e740: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
e750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e760: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
e770: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
e780: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
e790: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
e7a0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
e7b0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
e7c0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
e7d0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
e7e0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
e7f0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
e800: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
e810: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
e820: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
e830: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
e840: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
e850: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
e860: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e870: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
e880: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
e890: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
e8a0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e8b0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e8c0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e8d0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e8e0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e900: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e910: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e920: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
e930: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
e940: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
e950: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
e960: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
e970: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
e980: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
e990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e9a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e9b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e9c0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
e9d0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
e9e0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
e9f0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
ea00: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
ea10: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
ea20: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
ea30: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
ea40: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
ea50: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
ea60: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
ea70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
ea80: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
ea90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eaa0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
eab0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eac0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
ead0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
eae0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
eaf0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
eb00: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
eb10: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
eb20: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
eb30: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
eb40: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
eb50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
eb60: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
eb70: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
eb80: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
eb90: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
eba0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
ebb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ebc0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
ebd0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
ebe0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
ebf0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
ec00: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ec10: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
ec20: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
ec30: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
ec40: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
ec50: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
ec60: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
ec70: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
ec80: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
ec90: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
eca0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ecb0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
ecc0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ecd0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
ece0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
ecf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ed00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
ed10: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ed20: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ed30: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
ed40: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
ed50: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
ed60: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
ed70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
ed80: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
ed90: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
eda0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
edb0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
edc0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
edd0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ede0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
edf0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
ee00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
ee10: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
ee20: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
ee30: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ee40: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
ee50: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ee60: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ee70: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
ee80: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
ee90: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
eea0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
eeb0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
eec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
eed0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
eee0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
eef0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
ef00: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
ef10: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
ef20: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ef30: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ef40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ef50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ef60: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ef70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ef80: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ef90: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
efa0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
efb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
efc0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
efd0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
efe0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
eff0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
f000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f010: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
f020: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
f030: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
f040: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
f050: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
f060: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
f070: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
f080: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
f090: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
f0a0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
f0b0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
f0c0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
f0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
f0e0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
f0f0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
f100: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
f110: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
f120: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
f130: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
f140: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
f150: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
f160: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
f170: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
f180: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
f190: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
f1a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
f1b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f1c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
f1d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
f1e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f1f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f200: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f210: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
f220: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
f230: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
f240: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
f250: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
f260: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
f270: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f290: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
f2a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
f2b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
f2c0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
f2d0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
f2e0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
f2f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
f300: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
f310: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
f320: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
f330: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
f340: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
f350: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
f360: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
f370: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
f380: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
f390: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
f3a0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f3b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f3c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f3d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
f3e0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
f3f0: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
f400: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
f410: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
f420: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
f430: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
f440: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
f450: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
f460: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
f470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f480: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
f490: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
f4a0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
f4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
f4c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
f4d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f4e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
f4f0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
f500: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
f510: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
f520: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
f530: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
f540: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
f550: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
f560: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
f570: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
f580: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
f590: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
f5a0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
f5b0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
f5c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5d0: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
f5e0: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
f5f0: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
f600: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
f610: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
f620: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
f630: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
f640: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
f650: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f660: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
f670: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
f680: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
f690: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
f6a0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
f6b0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
f6c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
f6d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
f6e0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
f6f0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
f700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f710: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
f720: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
f730: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
f740: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f750: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
f760: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
f770: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
f780: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
f790: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
f7a0: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
f7b0: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
f7c0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
f7d0: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
f7e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
f7f0: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
f800: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f810: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
f820: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
f830: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
f840: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
f850: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
f860: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
f870: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
f880: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
f890: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
f8a0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
f8b0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
f8c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f8d0: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
f8e0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f8f0: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
f900: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
f910: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
f920: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
f930: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
f940: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f950: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
f960: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
f970: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
f980: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f990: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f9a0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f9b0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f9c0: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f9d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f9e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f9f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
fa00: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
fa10: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
fa20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa30: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
fa40: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
fa50: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
fa60: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
fa70: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
fa80: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
fa90: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
faa0: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
fab0: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
fac0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
fad0: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
fae0: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
faf0: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
fb00: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
fb10: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
fb20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fb30: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
fb40: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
fb50: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
fb60: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
fb70: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
fb80: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
fb90: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
fba0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
fbb0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
fbc0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
fbd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
fbe0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
fbf0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
fc00: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
fc10: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
fc20: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
fc30: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
fc40: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
fc50: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
fc60: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
fc70: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
fc80: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
fc90: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
fca0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
fcb0: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
fcc0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
fcd0: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
fce0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
fcf0: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
fd00: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fd20: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
fd30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
fd40: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
fd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd60: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
fd70: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
fd80: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
fd90: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
fda0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
fdb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
fdc0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
fdd0: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
fde0: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
fdf0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
fe00: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
fe10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
fe20: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
fe30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
fe40: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
fe50: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
fe60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fe70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fe80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
fe90: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
fea0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
feb0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
fec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
fed0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
fee0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
fef0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
ff00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ff10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ff20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ff30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
ff50: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ff60: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
ff70: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ff80: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ff90: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ffa0: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
ffb0: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
ffc0: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
ffd0: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
ffe0: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
fff0: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
10000 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10010 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
10020 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
10030 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
10040 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
10050 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
10060 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
10070 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
10080 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
10090 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
100a0 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
100b0 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
100c0 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20     if( pc>0 ){. 
100d0 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73       u32 next, s
100e0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
100f0 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
10100 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
10110 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
10120 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
10130 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
10140 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
10150 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
10160 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
10170 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10180 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10190 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
101a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
101b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
101c0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
101d0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
101e0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
101f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a  CORRUPT_BKPT; /*
10220 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
10230 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
10240 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ge */.        }.
10250 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67          next = g
10260 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10270 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  ]);.        size
10280 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10290 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
102a0 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
102b0 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  + size;.        
102c0 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
102d0 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
102e0 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10300 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
10310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10320 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
10330 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10340 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10350 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rder */.      }.
10360 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a        if( pc+siz
10370 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10380 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
103a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
103b0 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62  ;  /* Last freeb
103c0 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
103d0 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
103e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
103f0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
10400 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
10410 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
10420 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
10430 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
10440 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
10450 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
10460 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
10470 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
10480 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10490 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
104a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
104b0 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
104c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
104d0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
104e0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
104f0 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
10500 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
10510 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
10520 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
10530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10540 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
10550 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
10560 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
10570 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
10580 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
10590 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
105a0 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
105b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
105c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
105d0 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
105e0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
105f0 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
10600 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
10610 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
10620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10630 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10640 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10650 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10660 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10670 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10680 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10690 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
106a0 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
106b0 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
106c0 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
106d0 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
106e0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
106f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10700 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10710 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10720 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10740 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10750 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10760 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10780 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
10790 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
107a0 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
107b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
107c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
107d0 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
107e0 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
107f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10800 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
10810 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10830 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10840 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10850 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
10860 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
10870 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
10880 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
10890 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
108a0 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
108b0 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
108c0 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
108d0 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
108e0 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
108f0 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
10900 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
10910 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
10920 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
10930 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
10940 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
10950 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
10960 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
10970 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10980 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
10990 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
109a0 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
109b0 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
109c0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
109d0 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
109e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
109f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
10a00 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
10a10 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
10a20 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
10a30 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
10a40 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
10a50 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
10a60 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
10a70 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
10a80 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
10a90 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
10aa0 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
10ab0 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
10ac0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
10ad0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
10ae0 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
10af0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
10b00 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
10b10 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
10b20 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
10b30 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
10b40 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
10b50 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
10b60 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
10b70 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
10b80 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
10b90 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
10ba0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
10bb0 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
10bc0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
10bd0 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
10be0 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
10bf0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
10c00 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
10c10 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10c20 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
10c30 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
10c40 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
10c50 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
10c60 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
10c70 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
10c80 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
10c90 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
10ca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
10cb0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
10cc0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10cd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
10ce0 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
10cf0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10d00 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
10d10 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10d20 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10d30 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10d40 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
10d50 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
10d60 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
10d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
10d80 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10d90 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
10da0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
10db0 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
10dc0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
10dd0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
10de0 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
10df0 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
10e00 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
10e10 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
10e20 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
10e30 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
10e40 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
10e50 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
10e60 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
10e70 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
10e80 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
10e90 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
10ea0 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
10eb0 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
10ec0 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
10ed0 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
10ee0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
10ef0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
10f00 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
10f10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10f20 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
10f30 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
10f40 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
10f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10f60 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
10f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
10f80 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
10f90 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
10fa0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
10fb0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
10fc0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
10fd0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
10fe0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
10ff0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
11000 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
11010 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
11020 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
11030 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
11040 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
11050 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
11060 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
11070 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11080 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11090 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
110a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
110b0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
110c0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
110d0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
110e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
110f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
11100 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11110 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11120 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
11130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11140 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
11150 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
11160 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
11170 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
11180 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
11190 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
111a0 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
111b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
111c0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
111d0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
111e0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
111f0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
11200 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
11210 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
11220 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
11230 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
11240 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11260 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11270 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
11280 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
11290 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
112a0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
112b0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
112c0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
112d0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
112e0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
112f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11300 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
11310 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11320 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
11330 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
11340 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
11350 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
11360 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
11370 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
11380 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
11390 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
113a0 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
113b0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
113c0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
113d0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
113e0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
113f0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
11400 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
11410 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
11420 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
11430 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
11440 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
11450 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
11460 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
11470 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
11480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
11490 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
114a0 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
114b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
114c0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
114d0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
114e0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
114f0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
11500 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
11510 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
11520 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
11530 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
11540 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
11550 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
11560 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
11570 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
11580 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
11590 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
115a0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
115b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
115c0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
115d0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
115e0 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
115f0 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
11600 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
11610 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
11620 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
11630 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
11640 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
11650 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
11660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
11670 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
11680 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
116b0 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
116c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
116d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
116e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
116f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
11700 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
11710 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
11720 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
11730 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
11740 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
11750 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
11760 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
11770 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
11780 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
11790 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
117a0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
117b0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
117c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
117d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
117e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
117f0 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
11800 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
11810 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
11820 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11830 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
11840 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
11850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11860 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
11870 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
11880 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
11890 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
118a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
118b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
118c0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
118d0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
118e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
118f0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
11900 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
11910 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
11920 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
11930 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
11940 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11950 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
11960 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
11970 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11980 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
11990 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
119a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
119b0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119c0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119d0 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
119e0 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
119f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11a20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11a30 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11a40 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
11a50 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
11a60 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
11a70 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
11a80 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
11a90 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
11aa0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
11ab0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
11ac0 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
11ad0 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
11ae0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
11af0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
11b00 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
11b10 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
11b20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
11b30 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
11b40 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
11b50 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
11b60 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
11b70 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
11b80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11b90 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  PT;.    releaseP
11ba0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11bb0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11bc0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11be0 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
11bf0 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
11c00 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
11c10 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
11c20 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
11c30 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
11c40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
11c50 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
11c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11c70 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
11c80 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
11c90 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
11ca0 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
11cb0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
11cc0 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
11cd0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11ce0 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
11cf0 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
11d00 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11d20 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
11d30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
11d40 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
11d50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11d60 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11d70 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11d80 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11d90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11da0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11db0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11dc0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
11dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11de0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11df0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
11e10 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
11e20 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
11e30 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11e40 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11e50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
11e60 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
11e70 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
11e80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
11e90 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
11ea0 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
11eb0 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
11ec0 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
11ed0 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
11ee0 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
11ef0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
11f00 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
11f10 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
11f20 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
11f30 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
11f40 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
11f50 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
11f60 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
11f70 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
11f80 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
11f90 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
11fa0 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
11fb0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11fc0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
11fd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
11fe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11ff0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12000 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
12010 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12020 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
12030 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12040 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
12050 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12060 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12070 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12080 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12090 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
120a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
120b0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
120c0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
120f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
12100 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
12110 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
12120 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12130 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
12140 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
12150 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12160 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12170 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12180 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12190 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
121a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
121b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
121c0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
121d0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
121e0 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
121f0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
12200 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
12210 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
12220 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
12230 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
12240 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
12250 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12260 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12270 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12280 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
122a0 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
122b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
122c0 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
122d0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
122e0 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
122f0 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
12300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12310 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
12320 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
12330 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
12340 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
12350 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12360 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12380 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12390 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
123a0 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
123b0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
123c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
123d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
123e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
123f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
12400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12410 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12420 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
12430 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
12440 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
12450 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12460 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12470 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12480 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12490 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
124a0 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
124b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
124c0 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
124d0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
124e0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
124f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
12500 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
12510 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
12520 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
12530 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
12540 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
12550 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12560 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12570 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12580 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12590 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
125a0 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
125b0 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
125c0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
125d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
125e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
125f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
12600 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
12610 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
12620 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
12630 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12640 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
12650 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12660 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12670 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12680 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12690 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126a0 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
126b0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
126c0 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
126d0 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
126e0 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
12700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
12710 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
12720 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
12730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12740 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
12750 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
12760 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
12770 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
12780 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
12790 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
127a0 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
127b0 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
127c0 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
127d0 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
127e0 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
127f0 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
12800 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
12810 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
12820 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
12830 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
12840 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
12850 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
12860 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12870 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
12880 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12890 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
128a0 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
128b0 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
128c0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
128d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
128e0 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
128f0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
12900 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
12910 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
12920 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
12930 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
12940 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
12950 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
12960 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
12970 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12980 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12990 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
129a0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
129b0 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
129c0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
129d0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
129e0 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
129f0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
12a00 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
12a10 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
12a20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12a30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
12a40 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
12a50 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
12a60 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
12a70 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12a80 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
12a90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12aa0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12ab0 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
12ac0 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
12ad0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12ae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12af0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
12b00 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
12b10 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
12b20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12b30 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
12b40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12b50 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
12b60 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
12b70 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
12b80 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
12b90 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
12ba0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12bb0 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
12bc0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12be0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12bf0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12c00 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12c10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12c20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12c30 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
12c40 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
12c50 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
12c60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12c70 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
12c80 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
12c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
12ca0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
12cb0 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
12cc0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
12cd0 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
12ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12cf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
12d00 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
12d10 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
12d20 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
12d30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12d40 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
12d50 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
12d60 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
12d70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
12d80 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
12d90 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
12da0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
12db0 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
12dc0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
12dd0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12de0 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
12df0 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
12e00 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
12e10 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
12e20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
12e30 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
12e40 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
12e50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
12e60 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
12e70 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
12e80 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
12e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12ea0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
12eb0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12ec0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
12ed0 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12ee0 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
12ef0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
12f00 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
12f30 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
12f40 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
12f70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12f80 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
12f90 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12fa0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
12fb0 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
12fc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12fd0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12fe0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12ff0 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
13000 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
13010 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
13020 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
13030 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
13040 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
13050 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
13060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13070 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
13080 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
13090 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
130a0 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
130b0 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
130c0 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
130d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
130e0 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
130f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
13100 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
13110 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
13120 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
13130 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
13140 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
13150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
13160 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13170 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
13180 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
13190 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
131a0 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
131b0 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
131c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
131d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
131e0 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
131f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13200 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
13210 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
13220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13230 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13240 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13250 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13260 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13270 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13280 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13290 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
132a0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
132b0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
132c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
132d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
132e0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
132f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13300 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
13310 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
13320 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
13330 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
13340 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
13350 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13360 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13370 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13380 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13390 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
133a0 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
133b0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
133c0 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
133d0 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
133e0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
133f0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
13400 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
13410 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13420 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
13430 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
13440 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13450 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13460 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13470 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13480 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13490 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
134a0 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
134b0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
134c0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
134d0 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
134e0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
134f0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
13500 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
13510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13520 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13540 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
13550 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13560 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13570 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
13580 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
13590 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
135a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
135b0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
135c0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
135d0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
13600 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
13610 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13640 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13650 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13660 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13670 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13690 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
136a0 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
136b0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
136c0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
136d0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
136e0 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
136f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13700 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
13710 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
13720 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13730 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13740 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13760 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13770 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
13780 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
13790 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
137a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
137b0 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
137c0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
137d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
137e0 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
137f0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
13800 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
13810 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
13820 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
13830 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
13840 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
13850 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
13860 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
13870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13880 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
13890 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
138a0 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
138b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
138c0 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
138d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
138e0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
138f0 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
13900 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
13910 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
13920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13930 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
13940 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13960 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13970 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
13980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13990 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
139b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
139d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
139e0 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
139f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13a00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13a10 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13a20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13a50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13a60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13a70 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13a80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13a90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13aa0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
13ab0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
13ac0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
13ad0 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
13ae0 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
13af0 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
13b00 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13b10 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13b20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13b30 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13b40 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13b50 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13b60 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13b70 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13b90 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13ba0 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
13bb0 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
13bc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
13bd0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13be0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
13bf0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
13c00 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13c10 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13c20 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13c30 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13c40 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13c50 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13c60 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13c70 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13c80 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13c90 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13ca0 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
13cb0 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
13cc0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
13cd0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
13ce0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13cf0 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
13d00 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13d10 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13d20 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13d30 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13d40 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13d50 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13d60 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13d70 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13d80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13d90 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13da0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
13db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
13dc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
13dd0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13de0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13df0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13e00 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
13e10 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
13e20 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13e50 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
13e60 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13e70 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13ea0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13ec0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13ee0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
13f00 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
13f10 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
13f20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13f40 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13f50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
13f60 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
13f70 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
13f80 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
13f90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
13fa0 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
13fb0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
13fc0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
13fd0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
13fe0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
13ff0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
14000 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
14010 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14020 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
14030 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
14040 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
14050 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
14060 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
14070 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
14080 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14090 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
140a0 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
140b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
140c0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
140d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
140e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
140f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
14100 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
14110 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
14120 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
14130 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
14140 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
14150 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
14160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14170 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
14180 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
14190 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
141a0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
141b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
141c0 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
141d0 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
141e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
141f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
14200 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
14210 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
14220 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
14230 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
14240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14250 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
14260 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
14270 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
14280 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
14290 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
142a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
142b0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
142c0 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
142d0 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
142e0 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
142f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14300 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
14310 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
14320 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
14330 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
14340 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
14350 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
14360 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
14370 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
14380 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
14390 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
143a0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
143b0 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
143c0 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
143d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
143e0 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
143f0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14400 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
14410 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14420 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
14430 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
14440 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
14450 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
14460 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
14470 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
14480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
14490 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
144a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
144b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
144c0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
144d0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
144e0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
144f0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
14500 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
14510 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
14520 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
14530 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
14540 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
14550 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
14560 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
14570 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
14580 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
14590 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
145a0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
145b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
145c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
145d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
145e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
145f0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
14600 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
14610 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
14620 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14630 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14640 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
14650 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
14660 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14670 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14680 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14690 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
146a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
146b0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
146c0 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
146d0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
146e0 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
146f0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
14700 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
14710 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
14720 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
14730 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
14740 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
14750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14760 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14780 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
14790 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
147a0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
147b0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
147c0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
147d0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
147e0 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
147f0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
14800 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
14810 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14820 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
14830 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
14840 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14850 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14860 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14870 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14880 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14890 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
148a0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
148b0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
148c0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
148d0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
148e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
148f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14910 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14950 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14970 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14980 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14990 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
149a0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
149b0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149c0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
149d0 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
149e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14a00 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
14a10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a20 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14a30 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
14a40 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
14a50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14a60 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14a70 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14a80 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14a90 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
14aa0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
14ab0 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
14ac0 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
14ad0 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
14ae0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
14af0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
14b00 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
14b10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
14b20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
14b30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
14b40 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
14b50 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
14b60 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14b70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
14b80 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
14b90 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14bb0 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
14bc0 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
14bd0 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
14be0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
14bf0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
14c00 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
14c10 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
14c20 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
14c30 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
14c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14c50 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14c60 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14c70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14c80 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14c90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14ca0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14cb0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
14cc0 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
14cd0 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
14ce0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14cf0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
14d00 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14d10 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
14d20 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
14d30 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
14d40 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
14d50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
14d60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
14d70 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
14d80 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14da0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
14db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
14de0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
14df0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
14e00 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
14e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14e20 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
14e30 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
14e40 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14e50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e70 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14e80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14e90 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14ea0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14eb0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
14ec0 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
14ed0 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
14ee0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
14ef0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
14f00 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
14f10 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
14f20 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
14f30 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
14f40 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
14f50 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
14f60 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
14f70 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
14f80 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
14f90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
14fa0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
14fb0 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
14fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14fd0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
14fe0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
14ff0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
15000 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
15010 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
15020 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
15030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15040 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
15050 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
15060 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15070 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
15080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
15090 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
150a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
150b0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
150c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
150d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
150e0 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
150f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15100 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
15110 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
15120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
15130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
15140 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
15150 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
15160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15170 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
15180 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15190 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
151a0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
151b0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
151c0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
151d0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
151e0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
151f0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
15200 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
15210 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
15220 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
15230 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
15240 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
15250 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
15260 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15270 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15290 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
152a0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
152b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
152c0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
152d0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
152e0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
152f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15300 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
15310 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15320 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
15330 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
15340 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15350 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15360 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
15370 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15380 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
15390 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
153a0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
153b0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
153c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
153d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
153e0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
153f0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15400 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15410 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
15420 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
15430 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
15440 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15450 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15460 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
15470 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
15480 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
15490 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
154a0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
154b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
154c0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
154d0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
154e0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
154f0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
15500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15510 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
15520 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
15530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
15540 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
15550 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
15560 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
15570 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
15580 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
15590 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
155a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
155b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
155c0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
155d0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
155e0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
155f0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
15600 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
15610 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
15620 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
15630 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
15640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
15650 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
15660 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15670 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
15680 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
15690 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
156a0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
156b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
156c0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
156d0 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
156e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
156f0 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
15700 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
15710 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
15720 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
15730 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
15740 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
15750 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
15760 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
15770 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
15780 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
15790 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
157a0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
157b0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
157c0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
157d0 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
157e0 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
157f0 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
15800 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
15810 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
15820 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
15830 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
15840 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
15850 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
15860 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
15870 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
15880 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
15890 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
158a0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
158b0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
158c0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
158d0 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
158e0 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
158f0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
15900 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
15910 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
15920 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
15930 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
15940 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15950 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
15960 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
15970 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
15980 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
15990 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
159a0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
159b0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
159c0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
159d0 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
159e0 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
159f0 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
15a00 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
15a10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
15a20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
15a30 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
15a40 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
15a50 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
15a60 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
15a70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15a80 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
15a90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
15aa0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
15ab0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
15ac0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
15ad0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15ae0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
15af0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15b00 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15b10 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
15b20 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
15b30 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
15b40 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15b50 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
15b60 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
15b70 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
15b80 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
15b90 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
15ba0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
15bb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
15bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15bd0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
15be0 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
15bf0 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
15c00 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
15c10 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
15c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15c30 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15c40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15c50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c60 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
15c70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
15c80 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
15c90 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
15ca0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
15cb0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15cc0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
15cd0 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
15ce0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15cf0 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
15d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
15d10 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
15d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15d30 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
15d40 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
15d50 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
15d60 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15d70 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
15d80 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
15d90 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
15da0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
15db0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
15dc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
15dd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15de0 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
15df0 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
15e00 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
15e10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
15e20 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
15e30 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
15e40 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
15e50 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
15e60 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
15e70 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
15e80 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
15e90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15ea0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
15eb0 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
15ec0 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
15ed0 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
15ee0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15ef0 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
15f00 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
15f10 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
15f20 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
15f30 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
15f40 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
15f50 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
15f60 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
15f70 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
15f80 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
15f90 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
15fa0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15fb0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
15fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15fd0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
15fe0 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
15ff0 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
16000 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
16010 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
16020 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
16030 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
16040 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16050 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
16060 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
16070 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16090 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
160a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
160b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
160c0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
160d0 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
160e0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
160f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
16100 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
16110 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16120 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
16130 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
16140 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
16150 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
16160 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
16170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16180 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16190 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
161a0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
161b0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
161c0 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
161d0 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
161e0 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
161f0 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
16200 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
16210 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
16220 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
16230 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
16240 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
16250 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
16260 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
16270 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
16280 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
16290 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
162a0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
162b0 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
162c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
162d0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
162e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
162f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16320 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16330 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16340 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16350 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16360 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16370 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16380 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16390 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
163a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
163b0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
163c0 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
163d0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
163e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
163f0 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
16400 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16410 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
16420 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
16430 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
16440 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
16450 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
16460 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
16470 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
16480 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
16490 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
164a0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
164b0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
164c0 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
164d0 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
164e0 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
164f0 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
16500 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
16510 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
16520 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
16530 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
16540 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
16550 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
16560 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
16570 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16580 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
16590 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
165a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
165b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
165c0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
165d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
165e0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
165f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16600 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
16610 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
16620 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
16630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16660 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
16670 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16680 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
16690 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
166a0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
166b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
166c0 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
166d0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
166e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
166f0 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
16700 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
16710 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
16720 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16730 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16750 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16760 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16770 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16780 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16790 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
167a0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
167b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
167c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
167d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
167e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
167f0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
16800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
16810 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
16820 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
16830 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
16840 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
16850 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
16860 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
16870 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
16880 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
16890 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
168a0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
168b0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
168c0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
168d0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
168e0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
168f0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16900 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
16910 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
16920 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
16930 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
16940 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
16950 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
16960 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
16970 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
16980 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
16990 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
169a0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
169b0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
169c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
169d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
169e0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
169f0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
16a00 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a20 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
16a30 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
16a40 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
16a50 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
16a60 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
16a70 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
16a80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16a90 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16aa0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16ab0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16ac0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ad0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16af0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
16b00 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
16b10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16b20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16b30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16b40 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
16b50 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
16b60 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
16b70 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16b80 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
16b90 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
16ba0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
16bb0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
16bc0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
16bd0 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
16be0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
16bf0 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
16c00 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
16c10 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
16c20 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16c30 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
16c40 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
16c50 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
16c60 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
16c70 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
16c80 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
16c90 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16ca0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
16cb0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
16cc0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
16cd0 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
16ce0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
16cf0 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
16d00 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
16d10 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
16d20 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
16d30 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
16d40 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
16d50 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
16d60 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
16d70 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
16d80 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
16d90 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
16da0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
16db0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
16dc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16dd0 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
16de0 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
16df0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
16e00 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
16e10 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
16e20 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
16e30 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
16e40 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
16e50 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
16e60 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
16e70 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
16e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16e90 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
16ea0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
16eb0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16ec0 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
16ed0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16ee0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
16ef0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f00 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16f10 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
16f20 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
16f30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16f40 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
16f50 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
16f60 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
16f70 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
16f80 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
16f90 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
16fa0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
16fb0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fc0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
16fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
16fe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
16ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17000 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
17010 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
17020 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
17030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17040 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
17050 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
17060 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
17070 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17080 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
17090 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
170a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
170b0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
170c0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
170d0 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
170e0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
170f0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
17100 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
17110 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
17120 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
17130 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
17140 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
17150 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
17160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
17170 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
17180 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
17190 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
171a0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
171b0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
171c0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
171d0 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
171e0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
171f0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
17200 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
17210 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17240 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
17250 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
17260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17270 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
17280 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
17290 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
172a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
172b0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
172c0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
172d0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
172e0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
172f0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
17300 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
17310 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
17320 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
17330 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
17340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
17350 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
17360 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
17370 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
17380 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
17390 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
173a0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
173b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
173c0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
173d0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
173e0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
173f0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
17400 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
17410 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
17420 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
17430 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
17440 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
17450 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
17460 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
17470 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
17480 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
17490 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
174a0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
174b0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
174c0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
174d0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
174e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
174f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
17500 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
17510 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
17520 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
17530 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
17540 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
17550 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17560 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
17570 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
17580 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
17590 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
175a0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
175b0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
175c0 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
175d0 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
175e0 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
175f0 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
17600 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
17610 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
17620 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
17630 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
17640 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
17650 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
17660 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
17670 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
17680 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
17690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
176a0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
176b0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
176c0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
176d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176e0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
176f0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17700 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
17710 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17720 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
17730 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17740 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
17750 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
17760 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
17770 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17780 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
17790 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
177a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
177b0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
177c0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
177d0 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
177e0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
177f0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
17800 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
17810 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
17820 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
17830 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
17840 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
17850 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17860 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
17870 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
17880 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
17890 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
178a0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
178b0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
178c0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
178d0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
178e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
178f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
17910 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17920 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
17930 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
17940 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
17950 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
17960 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
17970 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
17980 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
17990 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
179a0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
179b0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
179c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
179d0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
179e0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
179f0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
17a00 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17a10 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
17a20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17a30 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
17a40 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
17a50 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
17a60 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
17a70 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
17a80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17a90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17aa0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
17ab0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17ac0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
17ad0 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
17ae0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17af0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
17b00 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17b10 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17b20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
17b30 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
17b40 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
17b50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
17b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
17b70 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
17b80 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
17b90 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
17ba0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
17bb0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
17bc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
17bd0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
17be0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
17bf0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17c00 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
17c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17c20 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
17c30 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
17c40 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
17c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17c60 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
17c70 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
17c80 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
17c90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17ca0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
17cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
17cc0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
17cd0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
17ce0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
17cf0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
17d00 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17d10 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
17d20 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
17d30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
17d40 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17d50 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
17d60 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
17d70 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
17d80 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17d90 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
17da0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17db0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17dc0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17de0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17df0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
17e00 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
17e10 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
17e20 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
17e30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
17e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17e50 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
17e60 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
17e70 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17e80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17e90 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
17ea0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
17eb0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
17ec0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17ed0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
17ee0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
17ef0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17f00 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
17f10 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
17f20 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
17f30 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
17f40 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
17f50 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
17f60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17f70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17f80 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
17f90 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
17fa0 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73  as not set the s
17fb0 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20  afety-level for 
17fc0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
17fd0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e  nnection.** usin
17fe0 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  g "PRAGMA synchr
17ff0 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74  onous", and if t
18000 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
18010 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
18020 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  * set to the val
18030 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
18040 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68  s function as th
18050 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
18060 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f  er,.** set it so
18070 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
18080 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18090 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41  OUS!=SQLITE_DEFA
180a0 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
180b0 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  OUS.static void 
180c0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
180d0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
180e0 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
180f0 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
18100 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
18110 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
18120 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
18130 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
18140 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
18150 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18160 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18170 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
18180 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
18190 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
181a0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
181b0 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
181c0 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
181d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
181e0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
181f0 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
18200 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18210 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18220 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18230 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18240 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18250 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18260 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
18270 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18280 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
18290 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
182a0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
182b0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
182c0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
182d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
182e0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
182f0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
18300 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
18310 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
18320 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18330 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
18340 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
18350 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
18360 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
18370 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
18380 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
18390 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
183a0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
183b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
183c0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
183d0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
183e0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
183f0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
18400 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
18410 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
18420 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18430 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18440 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
18450 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
18460 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
18470 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
18480 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
18490 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
184a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
184b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
184c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
184d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
184e0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
184f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18500 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18510 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18520 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
18530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18540 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18550 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
18560 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
18570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18580 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18590 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
185a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
185b0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
185c0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
185d0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
185e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18600 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
18610 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
18620 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
18630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18640 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18650 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
18660 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
18670 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
18680 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
18690 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
186a0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
186b0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
186c0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
186d0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
186e0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
186f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18700 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
18710 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
18720 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
18730 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
18740 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
18750 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
18760 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
18770 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
18780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
18790 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
187a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
187b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
187c0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
187d0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
187e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
187f0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
18800 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
18810 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
18820 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
18830 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
18840 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
18850 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
18860 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
18870 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
18880 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
18890 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
188a0 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
188b0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
188c0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
188d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
188e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
188f0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
18900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
18910 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
18920 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
18930 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18940 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18950 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
18960 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
18970 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18980 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
18990 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
189a0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
189b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
189c0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
189d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
189e0 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
189f0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18a00 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18a10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18a20 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
18a30 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
18a40 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
18a50 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
18a60 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
18a70 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
18a80 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
18a90 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
18aa0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
18ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
18ac0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
18ad0 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
18ae0 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
18af0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
18b00 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
18b10 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
18b20 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
18b30 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
18b40 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
18b50 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
18b60 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
18b70 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
18b80 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
18b90 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
18ba0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
18bb0 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
18bc0 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
18bd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18be0 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
18bf0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18c00 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
18c10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
18c20 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
18c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
18c40 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
18c50 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
18c60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18c80 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18c90 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
18ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
18cb0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
18cc0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
18cd0 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
18ce0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
18cf0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
18d00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
18d10 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18d20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18d50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18d60 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
18d70 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
18d80 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
18d90 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
18da0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
18db0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18dc0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18dd0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18de0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18df0 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18e00 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18e10 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18e20 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
18e30 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
18e40 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
18e50 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
18e60 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
18e70 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
18e80 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
18e90 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
18ea0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
18eb0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
18ec0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18ed0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18ee0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18ef0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18f00 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18f10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18f20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18f30 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18f40 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
18f50 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
18f60 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
18f70 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
18f80 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18f90 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
18fa0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
18fb0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
18fc0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18fd0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ff0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19000 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19010 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19020 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19030 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19040 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19050 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19060 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19070 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19080 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
19090 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
190a0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
190b0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
190c0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
190d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
190e0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
190f0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19100 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19110 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19120 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19130 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19140 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19150 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19160 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19170 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19180 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
19190 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
191a0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
191b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
191c0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
191d0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
191e0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
191f0 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19200 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19210 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19220 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19230 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19240 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19250 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19260 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19270 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19280 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
19290 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
192a0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
192b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
192c0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
192d0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
192e0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
192f0 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19300 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19310 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19320 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19330 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19350 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19360 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19370 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19380 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
19390 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
193a0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
193b0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
193c0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
193d0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
193e0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
193f0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19400 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19410 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19420 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19430 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19440 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19450 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19460 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19470 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19480 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
19490 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
194a0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
194b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
194c0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
194d0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
194e0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
194f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19500 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19510 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19520 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19550 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19580 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19590 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
195a0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
195b0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
195c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
195d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
195e0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
195f0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19600 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19610 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19620 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19630 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19640 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19650 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19660 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19670 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19680 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19690 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
196a0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
196b0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
196c0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
196d0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
196e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
196f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19700 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19710 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19720 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19730 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19740 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19750 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19760 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19770 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19780 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19790 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
197a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
197b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
197c0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
197d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
197e0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
197f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19800 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19810 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19820 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19830 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19840 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19850 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19860 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19870 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19880 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19890 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
198a0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
198b0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
198c0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
198d0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
198e0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
198f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19900 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19910 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19920 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19930 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19940 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19950 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19960 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19970 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19980 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19990 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
199a0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
199b0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
199c0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
199d0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
199e0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
199f0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19a00 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19a10 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19a20 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19a30 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19a40 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19a50 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19a60 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19a70 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19a80 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19a90 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19aa0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19ab0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ad0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19ae0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19af0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19b00 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19b10 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19b20 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19b30 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19b40 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19b50 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19b60 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19b70 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19b80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19b90 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19ba0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19bb0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19bc0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19bd0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19be0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19c00 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19c10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19c20 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19c30 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19c40 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19c50 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19c60 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19c70 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19c80 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19c90 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19ca0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19cb0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19cc0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19cd0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19ce0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19cf0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19d00 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19d10 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19d20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19d30 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19d40 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19d50 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19d60 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19d70 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19d80 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19d90 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19da0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19db0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19dc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19dd0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19de0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19df0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19e00 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19e10 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19e20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19e30 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
19e40 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
19e50 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
19e60 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
19e70 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
19e80 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
19e90 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
19ea0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
19eb0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
19ec0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19ed0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19ee0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19ef0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19f00 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19f10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19f20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19f30 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
19f40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
19f50 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
19f60 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
19f70 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
19f80 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
19f90 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
19fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
19fb0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
19fc0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19fd0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19ff0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a000 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a010 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a020 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a030 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a040 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a050 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a060 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a070 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a080 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a090 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a0a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a0b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a0c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a0d0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a0e0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a0f0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a100 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a110 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a120 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a130 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a140 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a150 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a160 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a180 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a1a0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a1b0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a1c0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a1d0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a1e0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a1f0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a200 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a210 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a220 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a230 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a240 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a250 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a260 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a270 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a280 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a2a0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a2b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a2c0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a2d0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a2e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a2f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a300 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a310 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a320 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a340 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a350 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a360 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a370 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a380 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a390 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a3a0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a3b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a3c0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a3d0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a3e0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a3f0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a400 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a410 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a420 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a430 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a440 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a450 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a460 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a470 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a480 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a490 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a4a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a4b0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a4c0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a4d0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a4e0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a4f0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a500 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a510 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a520 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a530 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a540 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a550 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a560 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a570 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a580 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a590 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a5a0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a5b0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a5c0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a5d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a5e0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a5f0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a600 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a610 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a620 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a630 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a640 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a650 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a660 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a670 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a680 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a690 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a6a0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a6b0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a6c0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a6d0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a6e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a6f0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a700 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a710 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a720 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a730 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a740 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a750 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a760 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a770 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a780 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a790 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a7a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1a7b0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1a7c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1a7d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a7e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a7f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a800 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1a810 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1a820 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1a830 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a840 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1a860 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1a870 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1a880 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1a890 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1a8a0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1a8b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1a8c0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1a8d0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1a8e0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1a8f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1a900 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1a910 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1a920 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a930 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1a940 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1a950 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1a960 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1a970 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1a980 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1a990 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1a9a0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1a9b0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1a9c0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a9d0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1a9e0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1a9f0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1aa00 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1aa10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1aa20 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1aa30 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1aa40 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1aa50 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1aa60 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1aa70 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1aa80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1aa90 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1aaa0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1aab0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1aac0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1aad0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1aae0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1aaf0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ab00 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1ab10 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1ab20 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1ab30 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ab40 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1ab50 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ab60 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1ab70 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ab80 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1ab90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1aba0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1abb0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1abc0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1abd0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1abe0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1abf0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1ac00 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1ac10 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ac20 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ac30 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ac40 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1ac50 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1ac60 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1ac70 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1ac80 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1ac90 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1aca0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1acb0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1acc0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1acd0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1ace0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1acf0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1ad00 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1ad10 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1ad20 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1ad30 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1ad40 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1ad50 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1ad60 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1ad70 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1ad80 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1ad90 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1ada0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1adb0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1adc0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1add0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1ade0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1adf0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1ae00 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1ae10 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1ae20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1ae30 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1ae40 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1ae50 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1ae60 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1ae70 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1ae80 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1ae90 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1aea0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1aeb0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1aec0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1aed0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1aee0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1aef0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1af00 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1af10 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1af20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1af30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1af40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1af50 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1af60 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1af70 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1af80 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1af90 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1afa0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1afb0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1afc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1afd0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1afe0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1aff0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1b000 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1b010 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b020 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b030 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1b040 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1b050 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1b060 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1b070 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b080 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1b090 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b0a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1b0b0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1b0c0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1b0d0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1b0e0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b0f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1b100 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1b110 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b120 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b130 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b140 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b160 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b170 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b180 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b190 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b1a0 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b1b0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b1c0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b1d0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b1e0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b1f0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b200 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b210 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b220 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b230 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b240 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b250 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b260 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b270 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b280 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b290 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b2a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b2b0 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b2c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b2d0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b2e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b2f0 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b300 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b310 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b320 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b330 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b340 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b350 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b360 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b370 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b380 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b390 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b3a0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b3b0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b3c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b3e0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b400 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b410 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b430 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b440 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b450 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b460 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b470 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b480 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b490 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b4a0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b4b0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b4c0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1b4d0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1b4e0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1b4f0 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1b500 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1b510 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b520 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1b530 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1b540 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1b550 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1b560 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1b570 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1b580 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1b590 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1b5a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b5b0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b5c0 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1b5d0 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1b5e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1b5f0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b600 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1b610 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1b620 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1b630 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1b640 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1b650 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1b660 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1b670 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1b680 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1b690 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1b6a0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1b6b0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1b6c0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1b6d0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1b6e0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1b6f0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1b700 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1b710 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1b720 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1b730 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1b740 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1b750 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1b760 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1b770 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1b780 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1b790 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1b7a0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1b7b0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1b7c0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1b7d0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1b7e0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1b7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b800 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1b810 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1b820 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1b830 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b840 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1b850 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1b860 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1b870 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1b880 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1b890 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1b8a0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1b8b0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1b8c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b8d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b8e0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1b910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1b930 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b940 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1b950 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1b960 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1b970 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b980 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1b990 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1b9a0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1b9b0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1b9c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b9d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1b9e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1b9f0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1ba00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1ba10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ba20 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ba30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1ba40 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1ba50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1ba60 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1ba70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1ba80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1ba90 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1baa0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1bab0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1bac0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1bad0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1bae0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1baf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1bb00 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1bb10 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1bb20 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1bb30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1bb40 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1bb50 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1bb60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bb70 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1bb80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1bb90 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1bba0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1bbb0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1bbc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bbd0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bbe0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1bbf0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1bc00 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1bc10 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1bc20 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1bc30 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1bc40 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1bc50 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1bc60 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1bc70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1bc80 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1bc90 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1bca0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1bcb0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1bcc0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1bcd0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1bce0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1bcf0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1bd00 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1bd10 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1bd20 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1bd30 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1bd40 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1bd50 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1bd60 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1bd70 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1bd80 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1bd90 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1bda0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1bdb0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1bdc0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1bdd0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1bde0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1bdf0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1be00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1be10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1be20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1be30 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1be40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1be50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1be60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1be70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1be80 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1be90 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1bea0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1beb0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1bec0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1bed0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1bee0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1bef0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1bf00 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1bf10 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1bf20 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1bf30 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1bf40 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1bf50 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1bf60 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1bf70 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1bf80 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1bf90 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1bfa0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1bfb0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1bfc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bfd0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1bfe0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1bff0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c000 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c010 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1c020 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c030 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c040 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1c050 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c060 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1c070 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1c080 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1c090 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1c0a0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1c0b0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1c0c0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1c0d0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c0e0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1c0f0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1c100 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1c110 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c120 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c130 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c140 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c150 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c180 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c190 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c1c0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c1d0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c1e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c200 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c220 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c230 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c240 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c250 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c260 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c270 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c280 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1c290 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1c2a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1c2c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1c2d0 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1c2e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1c2f0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1c300 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1c310 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1c320 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1c330 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1c340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c350 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1c360 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1c370 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1c380 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1c390 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1c3a0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1c3b0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1c3c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1c3d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1c3e0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1c3f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c410 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1c420 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1c430 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1c440 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1c450 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1c470 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1c480 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1c490 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1c4a0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1c4b0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1c4c0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1c4d0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1c4e0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1c4f0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1c500 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1c510 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1c520 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1c530 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1c540 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1c550 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1c560 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c580 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1c590 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1c5a0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1c5b0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1c5c0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c5d0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1c5e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c5f0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1c600 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1c610 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1c620 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1c630 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1c640 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1c650 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1c660 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1c670 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1c680 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1c690 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1c6a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1c6b0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1c6c0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1c6d0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1c6e0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1c6f0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1c700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c710 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1c720 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c730 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1c740 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1c750 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1c760 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c770 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1c780 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1c790 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1c7a0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1c7b0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1c7c0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1c7d0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1c7e0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1c7f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c810 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1c820 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1c830 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1c840 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1c850 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1c860 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1c870 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1c880 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1c890 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c8a0 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1c8b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1c8c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1c8d0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1c8e0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1c8f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1c900 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1c910 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c920 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1c930 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1c940 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1c950 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1c960 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1c970 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1c980 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1c990 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1c9a0 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1c9b0 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1c9c0 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1c9d0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1c9e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ca00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ca10 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1ca20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1ca30 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1ca40 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1ca50 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1ca60 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1ca70 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1ca80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ca90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1caa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cab0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1cac0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1cad0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1cae0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1caf0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1cb00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1cb10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1cb20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1cb30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1cb40 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1cb50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1cb60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1cb70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1cb80 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1cb90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1cba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1cbb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
1cbc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1cbd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1cbe0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1cbf0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1cc00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cc10 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1cc20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1cc30 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1cc40 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1cc50 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1cc60 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1cc70 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1cc80 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1cc90 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1cca0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1ccb0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1ccc0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1ccd0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1cce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1ccf0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1cd00 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1cd10 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1cd20 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1cd30 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1cd40 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1cd50 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1cd60 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1cd70 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1cd80 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1cd90 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1cda0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1cdb0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1cdc0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1cdd0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1cde0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1cdf0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1ce10 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1ce20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1ce30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1ce40 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ce50 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1ce60 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1ce70 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1ce80 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1ce90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cea0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1ceb0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1cec0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1ced0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1cee0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1cef0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1cf00 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1cf10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1cf20 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1cf30 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1cf40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1cf50 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1cf60 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1cf70 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1cf80 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1cf90 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1cfa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1cfb0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1cfc0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1cfd0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1cfe0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1cff0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d000 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1d010 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1d020 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d030 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d040 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d050 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1d060 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1d070 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1d080 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1d090 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1d0a0 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1d0b0 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1d0c0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1d0d0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1d0e0 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1d0f0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1d100 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1d110 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1d120 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1d130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1d140 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1d150 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1d160 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1d170 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1d180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d1a0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1d1b0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1d1c0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1d1d0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1d1e0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1d1f0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1d200 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1d210 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1d220 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1d230 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d240 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1d250 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1d260 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1d270 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1d280 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1d290 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1d2a0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1d2b0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1d2c0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1d2d0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1d2e0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1d2f0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d300 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1d310 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1d320 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1d330 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1d340 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d360 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d370 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d380 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1d390 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1d3a0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1d3b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d3c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d3d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1d3f0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1d400 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1d410 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1d420 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1d430 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d440 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1d450 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1d460 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1d470 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d4a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d4b0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1d4c0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1d4d0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1d4e0 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1d4f0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1d500 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d510 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1d520 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1d530 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1d540 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1d550 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d560 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1d570 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1d580 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d590 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1d5a0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1d5b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d5c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d5d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d5f0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1d600 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1d610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d620 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d630 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1d640 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d650 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d660 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1d670 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1d680 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1d690 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1d6a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1d6b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d6c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d6d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1d6e0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1d6f0 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1d700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1d720 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1d730 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1d740 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1d750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1d760 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d770 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1d780 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1d790 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1d7a0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1d7b0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1d7c0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1d7d0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1d7e0 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1d7f0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1d800 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1d810 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1d820 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1d830 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1d840 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1d850 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1d860 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1d870 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1d880 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1d890 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1d8a0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1d8b0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1d8c0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1d8d0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1d8e0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1d8f0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1d900 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1d910 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1d920 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1d930 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1d940 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1d950 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1d960 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1d970 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1d980 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1d990 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1d9a0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1d9b0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1d9c0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1d9d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1d9e0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1d9f0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1da00 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1da10 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1da20 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1da30 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1da40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1da50 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1da60 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1da70 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1da80 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1da90 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1daa0 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1dab0 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1dac0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1dad0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1dae0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1daf0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1db00 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1db10 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1db20 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1db30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1db40 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1db50 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1db60 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1db70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1db80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1db90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1dba0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1dbb0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1dbc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1dbd0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1dbe0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1dbf0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1dc00 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1dc10 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1dc20 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1dc30 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1dc40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1dc50 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1dc60 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1dc70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc80 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1dc90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1dca0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1dcb0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1dcc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1dcd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1dcf0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1dd00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1dd10 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1dd20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1dd30 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1dd40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1dd50 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1dd60 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1dd70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1dd80 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1dd90 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1dda0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1ddb0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1ddc0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1ddd0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1dde0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1ddf0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1de00 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1de10 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1de20 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1de30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1de40 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1de50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1de60 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1de70 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1de80 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1de90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dea0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1deb0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1dec0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1ded0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1dee0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1def0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1df00 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1df10 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1df20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1df30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1df50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1df60 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1df70 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1df80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1df90 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1dfa0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1dfb0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1dfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1dfd0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1dfe0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1dff0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1e000 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1e010 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1e020 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1e030 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1e040 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1e050 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1e060 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1e070 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1e080 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1e090 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e0a0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1e0b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1e0c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1e0d0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1e0e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e100 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e120 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1e130 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1e140 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1e150 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1e160 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1e170 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1e180 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e190 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1e1a0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1e1b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1e1c0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1e1d0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1e1e0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1e1f0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1e200 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1e210 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1e220 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1e230 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1e240 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1e250 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1e260 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e270 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1e280 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1e290 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1e2a0 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1e2b0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1e2c0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1e2d0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1e2e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1e2f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e300 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1e310 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1e320 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1e330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e350 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e360 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1e370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e380 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1e390 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1e3a0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e3b0 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1e3c0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1e3d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e3e0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1e3f0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1e400 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1e410 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1e420 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1e430 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1e440 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e450 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1e460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e470 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e480 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1e4a0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e4b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1e4c0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1e4d0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1e4e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e4f0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1e500 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1e510 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1e520 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1e530 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1e540 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1e550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1e570 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1e580 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1e590 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1e5a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1e5b0 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1e5c0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1e5d0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1e5e0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1e5f0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1e600 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e610 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1e620 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1e630 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1e640 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1e650 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1e660 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1e670 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1e680 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e6b0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1e6c0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1e6d0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1e700 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1e710 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1e720 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1e730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e740 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1e750 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1e760 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1e770 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1e780 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1e790 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1e7a0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1e7b0 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1e7c0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1e7d0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1e7e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e7f0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1e800 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e810 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1e820 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1e830 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e840 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1e850 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1e860 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1e870 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1e880 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1e890 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1e8a0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1e8b0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1e8c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1e8d0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1e8e0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1e8f0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1e900 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1e910 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1e920 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1e930 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1e940 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1e950 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1e960 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1e970 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1e980 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1e990 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1e9a0 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1e9b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e9c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1e9d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e9e0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1e9f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1ea00 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1ea10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1ea20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ea30 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1ea40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ea50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ea60 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ea70 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1ea80 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1ea90 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1eaa0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1eab0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1eac0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1ead0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1eae0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1eaf0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1eb00 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1eb10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1eb20 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1eb30 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1eb40 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1eb50 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1eb60 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1eb70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eb80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1eb90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1eba0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1ebb0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1ebc0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1ebd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ebe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ebf0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1ec00 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1ec10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ec20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1ec30 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1ec40 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1ec50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ec60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ec70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ec80 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1ec90 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1eca0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ecb0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ecc0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1ecd0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1ece0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ecf0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1ed00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ed10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ed20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ed30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ed40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1ed50 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1ed60 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1ed70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1ed80 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1ed90 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1eda0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1edb0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1edc0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1edd0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1ede0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1edf0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1ee00 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1ee10 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1ee20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1ee30 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1ee40 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1ee50 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1ee60 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1ee70 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1ee80 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1ee90 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1eea0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1eeb0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1eec0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1eed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1eee0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1eef0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1ef00 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1ef10 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1ef20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1ef30 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1ef40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ef50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ef60 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1ef70 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ef80 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1ef90 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1efa0 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1efb0 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1efc0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1efd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1efe0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1eff0 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1f000 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1f010 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1f020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1f030 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1f040 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1f050 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1f060 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1f070 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1f080 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1f090 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1f0a0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1f0b0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1f0c0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1f0d0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f0e0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1f0f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f100 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1f110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f120 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1f130 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1f140 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1f150 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1f160 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1f170 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1f180 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1f190 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1f1a0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1f1b0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1f1c0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1f1d0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1f1e0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1f1f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1f200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f210 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f220 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1f230 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f240 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f250 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1f260 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f270 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1f280 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1f290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f2a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f2b0 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1f2c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1f2d0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1f2e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f2f0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1f300 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1f310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1f320 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1f330 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f340 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f350 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1f360 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1f370 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1f380 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1f390 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1f3a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f3b0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f3c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f3d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f3e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f3f0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1f400 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1f410 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f420 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f430 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f440 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1f450 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1f460 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1f470 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f480 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1f490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1f4b0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f4c0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f4d0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1f4e0 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1f4f0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f500 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1f510 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1f520 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1f530 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1f540 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1f550 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1f560 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1f570 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f580 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1f590 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1f5a0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f5b0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1f5c0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1f5d0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1f5e0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1f5f0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1f600 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1f610 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1f620 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1f630 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1f640 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1f650 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1f660 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1f670 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1f680 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1f690 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1f6a0 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1f6b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1f6c0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1f6d0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1f6e0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1f6f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1f700 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1f710 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1f720 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1f730 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f750 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1f760 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1f770 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1f780 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1f790 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1f7a0 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1f7b0 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1f7c0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1f7d0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1f7e0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1f7f0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1f800 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1f810 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f820 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1f830 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1f840 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1f850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1f860 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1f870 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1f880 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1f890 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1f8a0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1f8b0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1f8c0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1f8d0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1f8e0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1f8f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1f900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f910 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1f920 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f930 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1f940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1f950 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1f960 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1f970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1f980 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1f990 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1f9a0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1f9b0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1f9c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1f9d0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1f9e0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1f9f0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1fa00 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1fa10 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1fa20 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1fa30 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1fa40 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1fa50 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1fa60 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1fa70 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1fa80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1fa90 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1faa0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1fab0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1fac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fad0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1fae0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1faf0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1fb00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fb10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1fb20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1fb30 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1fb40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fb50 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1fb60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1fb70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fb80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1fb90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fba0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1fbb0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1fbc0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1fbd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fbe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1fbf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fc00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1fc10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fc20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1fc30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1fc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fc50 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1fc60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1fc70 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1fc80 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1fc90 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1fca0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1fcb0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1fcc0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1fcd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fcf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1fd00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1fd10 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1fd20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fd30 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1fd40 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1fd50 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1fd60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1fd70 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1fd80 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1fd90 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1fda0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fdb0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1fdc0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1fdd0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1fde0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1fdf0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fe00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fe10 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1fe20 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1fe30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1fe40 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1fe50 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1fe60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1fe70 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1fe80 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1fe90 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1fea0 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1feb0 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1fec0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1fed0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1fee0 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1fef0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1ff00 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1ff10 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1ff20 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1ff30 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1ff40 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1ff50 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1ff60 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1ff70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ff80 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1ff90 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1ffa0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1ffb0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1ffc0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1ffd0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1ffe0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1fff0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20000 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
20010 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
20020 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
20030 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
20040 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
20050 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
20060 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
20070 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
20080 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
20090 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
200a0 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
200b0 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
200c0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
200d0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
200e0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
200f0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
20100 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
20110 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20120 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
20130 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
20140 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
20150 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
20160 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
20170 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
20180 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
20190 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
201a0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
201b0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
201c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
201d0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
201e0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
201f0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
20200 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
20210 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
20220 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
20230 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
20240 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
20250 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
20260 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20270 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
20280 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
20290 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
202a0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
202b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
202c0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
202d0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
202e0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
202f0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
20300 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
20310 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
20320 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
20330 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
20340 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
20350 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
20360 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
20370 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
20380 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
20390 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
203a0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
203b0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
203c0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
203d0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
203e0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
203f0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
20400 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
20410 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
20420 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20430 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
20440 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20450 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
20460 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
20470 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
20480 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20490 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
204a0 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
204b0 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
204c0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
204d0 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
204e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
204f0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
20500 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
20510 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
20520 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
20530 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
20540 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20550 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
20560 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
20570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20580 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
20590 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
205a0 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
205b0 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
205c0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
205d0 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
205e0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
205f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20600 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
20610 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
20620 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
20630 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
20640 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
20650 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
20660 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
20670 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
20680 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
20690 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
206a0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
206b0 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
206c0 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
206d0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
206e0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
206f0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
20700 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
20710 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
20720 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
20730 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
20740 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
20750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20760 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
20770 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
20780 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
20790 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
207a0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
207b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
207c0 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
207d0 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
207e0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
207f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
20800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20810 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
20820 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
20830 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20840 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
20850 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
20860 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
20870 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
20880 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
20890 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
208a0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
208b0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
208c0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
208d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
208e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
208f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
20900 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20910 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
20920 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20930 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
20940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20950 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
20960 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
20970 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20980 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
20990 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
209a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
209b0 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
209c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
209d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
209e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
209f0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
20a00 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
20a10 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
20a20 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
20a30 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
20a40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
20a50 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
20a60 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
20a70 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
20a80 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
20a90 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
20aa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20ab0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
20ac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20ad0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
20ae0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
20af0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20b00 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
20b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
20b20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20b30 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
20b40 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20b50 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
20b60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20b70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20b80 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20b90 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
20ba0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
20bb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
20be0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
20bf0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
20c00 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
20c10 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
20c20 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
20c30 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
20c40 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
20c50 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
20c60 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20c70 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
20c80 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
20c90 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
20ca0 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
20cb0 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
20cc0 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
20cd0 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
20ce0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
20cf0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
20d00 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
20d10 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
20d20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20d30 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
20d40 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
20d50 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
20d60 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
20d70 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20d80 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
20d90 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
20da0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
20db0 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
20dc0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
20dd0 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
20de0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
20df0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
20e00 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
20e10 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
20e20 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
20e30 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
20e40 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
20e50 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
20e60 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
20e70 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
20e80 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
20e90 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
20ea0 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
20eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
20ec0 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
20ed0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
20ee0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
20ef0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
20f00 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
20f10 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
20f20 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
20f30 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
20f40 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
20f50 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
20f60 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
20f70 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
20f80 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20f90 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
20fa0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
20fb0 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
20fc0 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
20fd0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
20fe0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
20ff0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
21000 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
21010 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
21020 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
21030 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
21040 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
21050 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
21060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21070 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
21080 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
21090 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
210a0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
210b0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
210c0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
210d0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
210e0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
210f0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
21100 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
21110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21120 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
21130 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
21140 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
21150 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
21160 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
21170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21180 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21190 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
211a0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
211b0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
211c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
211d0 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
211e0 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
211f0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
21200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21210 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
21220 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
21230 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
21240 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
21250 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
21260 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
21270 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21290 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
212a0 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
212b0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
212c0 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
212d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
212e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
212f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21300 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21310 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
21320 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
21330 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
21340 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
21350 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
21360 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
21370 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21380 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
21390 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
213a0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
213b0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
213c0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
213d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
213e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
213f0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
21400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21410 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21430 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21440 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21450 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
21460 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
21470 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
21480 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
21490 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
214a0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
214b0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
214c0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
214d0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
214e0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
214f0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
21500 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
21510 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21520 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21530 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21540 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21550 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21560 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21570 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21580 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21590 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
215a0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
215b0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
215c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
215d0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
215e0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
215f0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
21600 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
21610 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21620 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21630 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21640 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21650 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21660 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21670 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21680 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21690 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
216a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
216b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
216c0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
216d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
216e0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
216f0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
21700 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
21710 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21720 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21740 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21750 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21760 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21770 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21780 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21790 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
217a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
217b0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
217c0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
217d0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
217e0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
217f0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
21800 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21810 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21820 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21830 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21840 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21850 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21860 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21870 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21880 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21890 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
218a0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
218b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
218c0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
218d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
218e0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
218f0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
21900 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
21910 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21920 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21930 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21940 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21950 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21960 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21970 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21980 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21990 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
219a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
219b0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
219c0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
219d0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
219e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
219f0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
21a00 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21a10 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21a20 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21a30 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21a50 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21a60 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21a70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21a80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21a90 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21aa0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21ab0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
21ac0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
21ad0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21ae0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
21af0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
21b00 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
21b10 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21b20 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21b40 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21b60 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21b70 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21b80 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21b90 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21ba0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21bb0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21bc0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21bd0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21be0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21bf0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
21c00 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
21c10 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21c20 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
21c30 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
21c40 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
21c50 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
21c60 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
21c70 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
21c80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
21c90 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
21ca0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
21cb0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
21cc0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
21cd0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
21ce0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
21cf0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
21d00 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
21d10 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
21d20 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
21d30 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
21d40 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
21d50 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
21d60 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
21d70 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
21d80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21d90 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
21da0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
21db0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21dc0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
21dd0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
21de0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
21df0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
21e00 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
21e10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
21e20 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
21e30 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
21e40 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
21e50 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
21e60 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
21e70 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21e80 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
21e90 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
21ea0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
21eb0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
21ec0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
21ed0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
21ee0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
21ef0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
21f00 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
21f10 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
21f20 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
21f30 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
21f40 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
21f50 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
21f60 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
21f70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21f80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21f90 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
21fa0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
21fb0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
21fc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
21fd0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
21fe0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
21ff0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22000 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22010 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22020 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22030 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22050 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22060 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22070 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
22080 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
22090 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
220a0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
220b0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
220c0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
220d0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
220e0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
220f0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
22100 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
22110 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22120 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22130 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22140 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22150 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
22160 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22170 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
22180 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
22190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
221a0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
221b0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
221c0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
221d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
221e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
221f0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
22200 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
22210 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22220 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22230 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22240 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22250 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
22260 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
22270 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
22280 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
22290 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
222a0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
222b0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
222c0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
222d0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
222e0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
222f0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
22300 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
22310 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22320 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22330 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22340 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22350 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
22360 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22370 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22380 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
22390 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
223a0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
223b0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
223c0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
223d0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
223e0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
223f0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
22400 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
22410 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22420 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22430 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22440 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22450 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22470 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
22480 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22490 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
224a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
224b0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
224c0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
224d0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
224e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
224f0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
22500 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
22510 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22520 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22530 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22540 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22550 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22560 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22570 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22580 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22590 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
225a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
225b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
225d0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
225e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
225f0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
22600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22620 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22630 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22640 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22650 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22670 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22680 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22690 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
226a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
226b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
226c0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
226d0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
226e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
226f0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
22700 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
22710 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22720 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22730 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22740 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22750 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22760 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22770 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22780 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22790 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
227a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
227b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
227c0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
227d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
227e0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
227f0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
22800 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
22810 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22820 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22830 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22840 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22850 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22860 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22870 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22880 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22890 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
228a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
228b0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
228c0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
228d0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
228e0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
228f0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
22900 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
22910 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22920 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22930 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22940 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22950 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22960 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22970 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22980 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22990 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
229a0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
229b0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
229c0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
229d0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
229e0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
229f0 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
22a00 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
22a10 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22a20 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22a30 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22a40 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22a50 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22a60 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22a70 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22a80 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22a90 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22aa0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22ab0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
22ac0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
22ad0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
22ae0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
22af0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
22b00 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
22b10 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22b20 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22b30 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22b40 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22b50 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22b60 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
22b70 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
22b80 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
22b90 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
22ba0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
22bb0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
22bc0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22bd0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22be0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22bf0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22c00 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22c10 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
22c20 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
22c30 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
22c40 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
22c50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
22c60 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
22c70 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
22c80 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
22c90 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
22ca0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
22cb0 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
22cc0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
22cd0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
22ce0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
22cf0 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
22d00 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
22d10 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
22d20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
22d30 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
22d40 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
22d50 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
22d60 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
22d70 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
22d80 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
22d90 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
22da0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
22db0 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
22dc0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
22dd0 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
22de0 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
22df0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
22e00 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
22e10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
22e20 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
22e30 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
22e40 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
22e50 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
22e60 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
22e70 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
22e80 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
22e90 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
22ea0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
22eb0 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
22ec0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
22ed0 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
22ee0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
22ef0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
22f00 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
22f10 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
22f20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
22f30 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
22f40 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
22f50 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
22f60 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
22f70 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
22f80 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
22f90 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
22fa0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
22fb0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
22fc0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
22fd0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
22fe0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
22ff0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
23000 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23010 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23020 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23030 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23060 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
23070 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
230a0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
230b0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
230e0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
230f0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
23100 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
23110 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23120 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23130 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23140 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23150 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23180 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
23190 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
231a0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
231c0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
231d0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
231e0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
23210 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23220 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23230 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23240 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23250 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
23260 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23270 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
23280 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23290 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
232a0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
232b0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
232c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
232d0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
232e0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
232f0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
23300 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
23310 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23320 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23330 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23340 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23350 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
23360 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
23370 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
23380 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
23390 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
233a0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
233b0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
233c0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
233d0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
233e0 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
233f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23400 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
23410 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23420 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23430 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23440 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23450 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
23460 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
23470 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
23480 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
23490 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
234a0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
234b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
234c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
234d0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
234e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
234f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23500 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
23510 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23520 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23530 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23540 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23550 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23560 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23570 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23590 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
235a0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
235b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
235c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
235d0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
235e0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
235f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
23600 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
23610 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23620 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23630 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23640 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23650 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23660 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23670 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23680 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23690 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
236a0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
236b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
236c0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
236d0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
236e0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
236f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
23700 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
23710 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23720 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23730 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23740 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23750 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23760 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23770 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23780 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23790 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
237a0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
237b0 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
237c0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
237d0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
237e0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
237f0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23800 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
23810 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23820 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23830 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23840 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23850 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23860 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23870 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23880 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23890 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
238a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
238b0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
238c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
238d0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
238e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
238f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23900 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23940 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23980 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23990 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239c0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
239d0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
239e0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
239f0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23a10 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23a20 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23a30 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23a60 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23a70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23a80 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23a90 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23aa0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23ac0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23ad0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
23ae0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
23af0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
23b00 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
23b10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23b20 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23b30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23b40 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23b50 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23b60 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
23b70 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
23b80 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
23b90 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
23ba0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
23bb0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
23bc0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23bd0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23be0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23bf0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23c00 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23c10 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
23c20 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
23c30 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
23c40 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
23c50 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
23c60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23c70 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
23c80 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
23c90 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
23ca0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
23cb0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
23cc0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
23cd0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
23ce0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
23cf0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
23d00 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
23d10 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
23d20 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
23d30 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
23d40 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
23d50 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
23d60 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
23d70 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
23d80 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
23d90 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
23da0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
23db0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
23dc0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
23dd0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
23de0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
23df0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
23e00 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23e10 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
23e20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
23e30 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
23e40 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
23e50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
23e60 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
23e70 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
23e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23e90 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
23ea0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
23eb0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
23ec0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23ed0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
23ee0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
23ef0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
23f00 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
23f10 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
23f20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
23f30 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
23f40 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
23f50 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
23f60 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
23f70 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
23f80 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
23f90 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
23fa0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
23fb0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
23fc0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
23fd0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
23fe0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
23ff0 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
24000 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
24010 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
24020 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24030 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
24040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
24050 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
24060 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
24070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
24090 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
240a0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
240b0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
240c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
240d0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
240e0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
240f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24100 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
24110 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
24120 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
24130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24140 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
24150 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
24160 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
24170 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
24180 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
24190 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
241a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
241b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
241c0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
241d0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
241e0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
241f0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
24200 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
24210 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
24220 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
24230 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
24240 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
24250 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
24260 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
24270 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
24280 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
24290 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
242a0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
242b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
242c0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
242d0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
242e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
242f0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
24300 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
24310 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
24320 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24330 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
24340 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
24350 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
24360 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
24370 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
24380 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
24390 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c  Page], pCur->ix,
243a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
243b0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
243c0 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  || memcmp(&info,
243d0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
243e0 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
243f0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
24400 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
24410 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
24420 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
24430 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
24440 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
24450 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
24460 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
24470 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  0 ){.    int iPa
24480 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
24490 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  ;.    pCur->curF
244a0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
244b0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
244c0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
244d0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
244e0 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69  Cur->ix,&pCur->i
244f0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
24500 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
24510 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
24520 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
24530 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
24540 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
24550 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
24560 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
24570 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
24580 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
24590 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
245a0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
245b0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
245c0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
245d0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
245e0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
245f0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
24600 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
24610 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
24620 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
24630 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
24640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24650 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
24660 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24670 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
24680 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
24690 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
246a0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
246b0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   */.int sqlite3B
246c0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
246d0 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  dNN(BtCursor *pC
246e0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ur){.  assert( p
246f0 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Cur!=0 );.  retu
24700 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  rn pCur->eState=
24710 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
24720 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24730 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
24740 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22  integer key or "
24750 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62  rowid" for a tab
24760 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69  le btree..** Thi
24770 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
24780 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75  y valid for a cu
24790 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
247a0 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20  nting into a.** 
247b0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62  ordinary table b
247c0 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75  tree.  If the cu
247d0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
247e0 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72  n index btree or
247f0 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20  .** is invalid, 
24800 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
24810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e  is routine is un
24820 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20  defined..*/.i64 
24830 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
24840 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  gerKey(BtCursor 
24850 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
24860 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24870 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24880 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24890 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
248a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
248b0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
248c0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
248d0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
248e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
248f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24900 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
24910 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66  tes of payload f
24920 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
24930 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72  t pCur is.** cur
24940 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
24950 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62  to.  For table b
24960 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
24970 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   be the amount.*
24980 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20  * of data.  For 
24990 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68  index btrees, th
249a0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  is will be the s
249b0 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a  ize of the key..
249c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
249d0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
249e0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
249f0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
24a00 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
24a10 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
24a20 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
24a30 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
24a40 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
24a50 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
24a60 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
24a70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24a80 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  ID..*/.u32 sqlit
24a90 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
24aa0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
24ab0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
24ac0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24ad0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24ae0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24af0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24b00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24b10 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
24b20 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
24b30 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  d;.}../*.** Give
24b40 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
24b50 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
24b60 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
24b70 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
24b80 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
24b90 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
24ba0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
24bb0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
24bc0 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
24bd0 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
24be0 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
24bf0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
24c00 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
24c10 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
24c20 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
24c30 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
24c40 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
24c50 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
24c60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24c70 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
24c80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
24c90 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
24ca0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
24cb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24cc0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
24cd0 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
24ce0 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
24cf0 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
24d00 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
24d10 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
24d20 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
24d30 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
24d40 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
24d50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
24d60 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
24d70 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
24d80 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
24d90 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
24da0 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
24db0 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
24dc0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
24dd0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24de0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
24df0 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
24e00 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
24e10 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
24e20 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
24e30 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
24e40 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
24e50 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
24e60 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
24e70 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
24e80 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
24e90 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
24ea0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
24eb0 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
24ec0 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
24ed0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
24ee0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
24ef0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
24f00 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
24f10 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
24f20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
24f30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
24f40 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
24f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
24f60 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
24f70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
24f80 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
24f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24fa0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
24fb0 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
24fc0 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
24fd0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
24fe0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
24ff0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
25000 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
25010 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
25020 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25030 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
25040 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
25050 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25060 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
25070 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
25080 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
25090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
250a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
250b0 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
250c0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
250d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
250e0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
250f0 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
25100 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
25110 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
25120 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
25130 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
25140 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
25150 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
25160 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
25170 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
25180 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
25190 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
251a0 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
251b0 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
251c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
251d0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
251e0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
251f0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
25200 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
25210 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
25220 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
25230 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
25240 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
25250 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
25260 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
25270 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
25280 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
25290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
252a0 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
252b0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
252c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
252d0 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
252e0 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
252f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25300 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
25310 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
25320 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
25330 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
25340 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
25350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
25360 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
25370 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
25380 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
25390 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
253a0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
253b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
253c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
253d0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
253e0 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
253f0 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
25400 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
25410 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
25420 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
25430 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
25440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25450 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
25460 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
25470 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
25480 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
25490 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
254a0 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
254b0 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
254c0 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
254d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
254e0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
254f0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
25500 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
25510 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
25520 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
25530 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
25540 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
25550 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
25560 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
25570 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
25580 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
25590 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
255a0 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
255b0 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
255c0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
255d0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
255e0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
255f0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
25600 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
25610 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
25620 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
25630 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
25640 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
25650 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
25660 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
25670 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
25680 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
25690 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
256a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
256b0 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
256c0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
256d0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
256e0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
256f0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
25700 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
25710 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
25720 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
25730 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
25740 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
25750 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
25760 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
25770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25780 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
25790 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
257a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
257b0 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
257c0 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
257d0 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
257e0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
257f0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
25800 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
25810 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
25820 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
25830 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
25840 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
25850 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
25860 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
25870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25880 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
25890 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
258a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
258b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
258c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
258d0 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
258e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
258f0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
25900 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
25910 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
25920 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
25930 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
25940 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
25950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25970 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25980 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
25990 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
259a0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
259b0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
259c0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
259d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
259e0 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
259f0 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
25a00 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
25a10 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
25a20 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
25a30 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
25a40 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
25a50 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
25a60 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
25a70 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
25a80 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
25a90 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
25aa0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
25ab0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
25ac0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
25ad0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
25ae0 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
25af0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
25b00 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
25b10 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
25b20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
25b30 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
25b40 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
25b50 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
25b60 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
25b70 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
25b80 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
25b90 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
25ba0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
25bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a  verflow pages.**
25bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
25bd0 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ay allocate spac
25be0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
25bf0 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65   populate.** the
25c00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
25c10 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
25c20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
25c30 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
25c40 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
25c50 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
25c60 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
25c70 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
25c80 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
25c90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
25ca0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25cb0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25cc0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
25cd0 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  it must be.** in
25ce0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
25cf0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
25d00 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
25d10 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
25d20 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
25d30 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
25d40 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
25d50 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
25d60 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
25d70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
25d80 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
25d90 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
25da0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
25db0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
25dc0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
25dd0 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
25de0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
25df0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
25e00 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
25e10 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
25e20 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
25e30 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
25e40 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
25e50 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
25e60 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
25e70 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
25e80 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
25e90 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25ea0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
25eb0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
25ec0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
25ed0 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
25ee0 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
25ef0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
25f00 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
25f10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25f20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
25f30 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
25f40 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
25f50 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
25f60 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
25f70 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
25f80 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
25f90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25fa0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
25fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25fc0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
25fd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25fe0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25ff0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
26000 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
26010 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
26020 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26030 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26050 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
26060 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
26070 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26080 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
26090 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
260a0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
260b0 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20  fStart = pBuf;  
260c0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f     /* Start of o
260d0 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66  riginal out buff
260e0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
260f0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
26100 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
26110 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20  0 || eOp==1 );. 
26120 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26130 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26140 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
26150 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
26160 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
26170 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26180 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
26190 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
261a0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
261b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
261c0 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20  load;.  assert( 
261d0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
261e0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
261f0 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d );..  assert( 
26200 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65  aPayload > pPage
26210 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28  ->aData );.  if(
26220 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64   (uptr)(aPayload
26230 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29   - pPage->aData)
26240 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   > (pBt->usableS
26250 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize - pCur->info
26260 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  .nLocal) ){.    
26270 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
26280 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
26290 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
262a0 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ata is an error.
262b0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e    The.    ** con
262c0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69  ditional above i
262d0 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a  s really:.    **
262e0 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43      &aPayload[pC
262f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
26300 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
26310 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
26320 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20  ].    ** but is 
26330 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20  recast into its 
26340 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20  current form to 
26350 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76  avoid integer ov
26360 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a  erflow problems.
26370 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
26380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
26390 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
263a0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
263b0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
263c0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
263d0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
263e0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
263f0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
26400 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
26410 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
26420 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
26430 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
26440 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
26450 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
26460 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
26470 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
26480 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
26490 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
264a0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
264b0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
264c0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
264d0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
264e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
264f0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
26500 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
26510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26520 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
26530 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
26540 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
26550 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
26560 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
26570 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
26580 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
26590 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
265a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
265b0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
265c0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
265d0 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
265e0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
265f0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
26600 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
26610 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
26620 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
26630 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
26640 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
26650 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
26660 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
26670 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
26680 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
26690 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
266a0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
266b0 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
266c0 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
266d0 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
266e0 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
266f0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
26700 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
26710 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
26720 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
26730 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
26740 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
26750 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26760 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
26770 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
26780 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
26790 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
267a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
267b0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
267c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  e;.      if( nOv
267d0 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c  fl>pCur->nOvflAl
267e0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50  loc ){.        P
267f0 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
26800 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
26810 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
26820 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
26830 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
26840 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
26850 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
26860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26880 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
26890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
268a0 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
268b0 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
268c0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
268d0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
268e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
268f0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
26900 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
26910 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
26920 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
26930 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
26940 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
26950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26960 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
26970 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26980 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
26990 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
269a0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  .      ** entry 
269b0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
269c0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
269d0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
269e0 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72  kip.      ** dir
269f0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
26a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
26a10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26a20 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
26a30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78   ){.        iIdx
26a40 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
26a50 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ize);.        ne
26a60 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
26a70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
26a80 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
26a90 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
26aa0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
26ab0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
26ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26ad0 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69  amt>0 );.    whi
26ae0 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a  le( nextPage ){.
26af0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
26b00 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
26b10 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26b20 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
26b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26b40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26b50 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dx]==0.         
26b60 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f       || pCur->aO
26b70 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
26b80 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20  extPage.        
26b90 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
26ba0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75  _DB );.      pCu
26bb0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26bc0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a  x] = nextPage;..
26bd0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
26be0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
26bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
26c00 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
26c10 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
26c20 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
26c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
26c40 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
26c50 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26c60 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
26c70 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
26c80 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
26c90 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
26ca0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
26cb0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
26cc0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
26cd0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
26ce0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
26cf0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
26d00 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
26d10 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
26d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
26d30 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
26d40 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
26d50 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
26d60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26d70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
26d80 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
26d90 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26da0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
26db0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26dc0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
26dd0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
26de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26df0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
26e00 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
26e10 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
26e20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
26e30 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
26e40 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
26e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e60 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
26e70 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
26e80 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
26e90 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
26ea0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
26eb0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
26ec0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
26ed0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
26ee0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
26ef0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26f00 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26f10 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
26f20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
26f30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f       /* File fro
26f40 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69  m which to do di
26f50 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65  rect overflow re
26f60 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  ad */.#endif.   
26f70 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
26f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
26f90 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
26fa0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
26fb0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
26fc0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
26fd0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
26fe0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26ff0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
27000 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
27010 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
27020 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27030 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
27040 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
27050 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
27060 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
27070 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
27080 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27090 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
270a0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
270b0 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f    3) there is no
270c0 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
270d0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
270e0 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
270f0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
27100 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
27110 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
27120 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
27130 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20   the WAL file.  
27140 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74        **   6) at
27150 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
27160 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
27170 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
27180 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
27190 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
271a0 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
271b0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
271c0 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
271d0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
271e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
271f0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
27200 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
27210 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
27220 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
27230 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
27240 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
27250 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
27260 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
27270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27280 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
272c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
272d0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
27310 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
27320 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27330 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27350 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
27360 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
27370 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
27380 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
27390 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a  s     /* (4) */.
273a0 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
273b0 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61  qlite3PagerUseWa
273c0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  l(pBt->pPager, n
273d0 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f  extPage)       /
273e0 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
273f0 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
27400 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
27430 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
27440 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
27450 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
27460 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
27470 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
27480 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
27490 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28       /* due to (
274c0 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  6) */.          
274d0 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
274e0 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
274f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27500 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
27510 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
27520 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
27530 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
27540 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
27550 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
27560 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27570 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
27580 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
27590 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
275a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
275b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
275c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
275d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
275e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
275f0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
27610 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  Op==0 ? PAGER_GE
27620 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
27630 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
27640 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27660 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
27670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
27680 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
27690 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
276a0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
276b0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
276c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
276d0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
276e0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
276f0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
27700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27710 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
27720 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
27730 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
27740 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27750 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27760 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
27770 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30        if( amt==0
27780 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27790 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
277a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
277b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
277c0 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20       iIdx++;.   
277d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
277e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
277f0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
27800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27810 54 5f 42 4b 50 54 3b 20 2f 2a 20 4f 76 65 72 66  T_BKPT; /* Overf
27820 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70  low chain ends p
27830 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20  rematurely */.  
27840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27850 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27860 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
27870 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
27880 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
27890 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
278a0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
278b0 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
278c0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
278d0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
278e0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
278f0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
27900 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
27910 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
27920 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
27930 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
27940 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
27950 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
27960 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
27970 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
27980 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
27990 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
279a0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
279b0 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
279c0 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
279d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
279e0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
279f0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27a00 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
27a10 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
27a20 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
27a30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
27a40 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
27a50 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
27a60 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
27a70 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
27a80 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
27a90 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
27aa0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
27ab0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
27ac0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
27ad0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
27ae0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
27af0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
27b00 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
27b10 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
27b20 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
27b30 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
27b40 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
27b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27b60 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
27b70 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
27b80 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
27b90 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
27ba0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27bb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27bc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27bd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27be0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27bf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27c00 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
27c10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
27c20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27c30 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ix<pCur->apPage[
27c40 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27c50 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
27c60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27c70 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
27c80 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
27c90 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
27ca0 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
27cb0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
27cc0 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
27cd0 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
27ce0 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
27cf0 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
27d00 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
27d10 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
27d20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
27d30 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
27d40 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
27d50 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
27d60 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
27d70 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
27d80 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
27d90 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
27da0 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
27db0 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
27dc0 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
27dd0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
27de0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27df0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
27e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27e10 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
27e20 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27e30 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27e40 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
27e50 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
27e60 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
27e70 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
27e80 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
27e90 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
27ea0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
27eb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27ec0 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
27ed0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27ee0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27ef0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
27f00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
27f10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
27f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
27f30 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27f40 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
27f50 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27f60 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27f70 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
27f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
27f90 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
27fa0 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
27fb0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
27fc0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
27fd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
27fe0 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
27ff0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
28000 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
28010 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
28020 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
28030 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
28040 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
28050 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
28060 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
28070 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
28080 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
28090 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
280a0 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
280b0 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
280c0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
280d0 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
280e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
280f0 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
28100 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
28110 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
28120 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
28130 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
28140 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
28150 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
28160 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
28170 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
28180 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
28190 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
281a0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
281b0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
281c0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
281d0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
281e0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
281f0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
28200 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
28210 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
28220 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
28230 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
28240 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
28250 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
28260 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
28270 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
28280 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
28290 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
282a0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
282b0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
282c0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
282d0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
282e0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
282f0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
28300 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
28310 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
28320 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
28330 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
28340 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
28350 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
28360 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
28370 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
28380 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
28390 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
283a0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
283b0 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
283c0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
283d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
283e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
283f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
28400 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
28410 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
28420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
28430 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
28440 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
28450 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  here */.){.  u32
28460 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
28470 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
28480 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
28490 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
284a0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
284b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
284c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
284d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
284e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
284f0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28500 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28510 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28520 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
28530 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28540 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ix<pCur->apPage[
28550 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28560 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
28570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28580 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
28590 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
285a0 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67  load>pCur->apPag
285b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
285c0 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
285d0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
285e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
285f0 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67  load<pCur->apPag
28600 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28610 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
28620 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
28630 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61  (int)(pCur->apPa
28640 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28650 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
28660 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
28670 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  ;.  if( pCur->in
28680 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20  fo.nLocal<amt ) 
28690 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  amt = pCur->info
286a0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74  .nLocal;.  *pAmt
286b0 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e   = amt;.  return
286c0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
286d0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
286e0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
286f0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
28700 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
28710 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
28720 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
28730 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
28740 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
28750 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
28760 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
28770 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
28780 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
28790 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
287a0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
287b0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
287c0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
287d0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
287e0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
287f0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
28800 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
28810 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
28820 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
28830 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
28840 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
28850 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
28860 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
28870 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
28880 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
28890 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
288a0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
288b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
288c0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
288d0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
288e0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
288f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
28900 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
28910 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
28920 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
28930 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28940 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
28950 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
28960 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
28970 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
28980 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
28990 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
289a0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
289b0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
289c0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
289d0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
289e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
289f0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
28a00 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
28a10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28a20 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
28a30 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
28a40 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
28a50 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
28a60 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
28a70 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
28a80 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
28a90 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
28aa0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
28ab0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
28ac0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
28ad0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
28ae0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
28af0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28b00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
28b10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28b20 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
28b30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
28b40 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
28b50 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28b60 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28b90 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28ba0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
28bb0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
28bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28bd0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
28be0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
28bf0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
28c00 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
28c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28c20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
28c30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28c40 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28c50 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28c60 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28c70 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28c80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28c90 2d 3e 69 50 61 67 65 2b 2b 5d 20 3d 20 70 43 75  ->iPage++] = pCu
28ca0 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 69  r->ix;.  pCur->i
28cb0 78 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  x = 0;.  return 
28cc0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
28cd0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
28ce0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28cf0 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
28d20 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a  PagerFlags);.}..
28d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28d40 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
28d50 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
28d60 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
28d70 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
28d80 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
28d90 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
28da0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
28db0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
28dc0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
28dd0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
28de0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
28df0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
28e00 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
28e10 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
28e20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
28e30 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
28e40 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
28e50 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
28e60 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
28e70 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
28e80 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
28e90 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
28ea0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
28eb0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
28ec0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
28ed0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
28ee0 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
28ef0 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
28f20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
28f30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
28f40 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
28f50 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
28f60 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
28f70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28f80 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
28f90 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
28fa0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
28fb0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
28fc0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
28fd0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28fe0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
28ff0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
29000 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
29010 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
29020 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
29030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
29040 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
29050 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29060 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
29070 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
29080 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
29090 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
290a0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
290b0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
290c0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
290d0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
290e0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
290f0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
29100 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
29110 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
29120 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
29130 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
29140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
29150 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
29160 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29170 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29180 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29190 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
291a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
291b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
291c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
291d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
291e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
291f0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
29200 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
29210 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
29220 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
29230 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
29240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29250 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
29260 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29270 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
29280 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
29290 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
292a0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
292b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
292c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
292d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
292e0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
292f0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
29300 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
29310 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
29320 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
29330 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29340 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
29350 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
29360 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
29370 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
29380 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29390 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
293a0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
293b0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
293c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
293d0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
293e0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
293f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
29400 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
29410 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
29420 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
29430 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
29440 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
29450 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
29460 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
29470 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
29480 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
29490 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
294a0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
294b0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
294c0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
294d0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
294e0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
294f0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
29500 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
29510 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
29520 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
29530 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
29540 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
29550 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
29560 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
29570 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
29580 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
29590 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
295a0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
295b0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
295c0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
295d0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
295e0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
295f0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
29600 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
29610 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
29620 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
29630 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
29640 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
29650 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
29660 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
29670 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
29680 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
29690 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
296a0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
296b0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
296c0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
296d0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
296e0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
296f0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
29700 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
29710 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
29720 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
29730 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
29740 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
29750 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
29760 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
29770 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
29780 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
29790 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
297a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
297b0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
297c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
297d0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
297e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
297f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29800 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
29820 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
29830 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29850 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
29860 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29870 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
29880 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
29890 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
298a0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
298b0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
298c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
298d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
298e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
298f0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
29900 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
29910 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
29920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
29930 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
29940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
29950 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
29960 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
29970 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29990 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
299a0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
299b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
299c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
299d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
299e0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
299f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29a00 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
29a10 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
29a20 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
29a30 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29a40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29a50 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29a60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29a70 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29a80 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29ab0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29ac0 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
29ad0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
29ae0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
29af0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
29b00 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
29b10 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
29b30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
29b40 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
29b70 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29b80 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74  ALID;.       ret
29b90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29ba0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
29bb0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
29bc0 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61  IntKey = pCur->a
29bd0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
29be0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
29bf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
29c00 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29c10 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
29c20 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
29c30 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
29c40 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
29c50 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
29c60 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
29c70 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
29c80 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
29c90 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
29ca0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
29cb0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
29cc0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
29cd0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
29ce0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
29cf0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
29d00 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
29d10 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
29d20 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
29d30 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
29d40 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
29d50 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
29d60 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
29d70 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
29d80 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
29d90 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
29da0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
29db0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
29dc0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
29dd0 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
29de0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
29df0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
29e00 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
29e10 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
29e20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
29e30 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
29e40 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
29e50 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
29e60 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
29e70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
29e80 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
29e90 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
29ea0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
29eb0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
29ec0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
29ed0 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
29ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29ef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29f00 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  PT;.  }..skip_in
29f10 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
29f20 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29f30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29f40 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29f50 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29f60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29f70 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29f80 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29f90 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66  >apPage[0];.  if
29fa0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
29fb0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29fc0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29fd0 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
29fe0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
29ff0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
2a000 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
2a010 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
2a020 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a030 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
2a040 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a050 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
2a060 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
2a070 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
2a080 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2a090 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
2a0a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
2a0b0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
2a0c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2a0d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2a0e0 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
2a0f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2a100 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2a110 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
2a120 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2a130 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
2a140 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
2a150 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2a160 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
2a170 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
2a180 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2a190 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
2a1a0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
2a1b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2a1c0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2a1d0 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
2a1e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a1f0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2a200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a210 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2a220 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2a230 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a240 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a260 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a270 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2a280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a290 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2a2a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a2b0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
2a2c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a2d0 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  >ix<pPage->nCell
2a2e0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2a2f0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2a300 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  (pPage, pCur->ix
2a310 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2a320 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2a330 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2a340 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a350 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a360 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2a370 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2a380 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2a390 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2a3a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2a3b0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2a3c0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2a3d0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2a3e0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2a3f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2a400 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2a410 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2a420 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2a430 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2a440 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2a450 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2a460 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2a470 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2a480 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2a490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2a4a0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2a4b0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2a4c0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2a4d0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2a4e0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2a4f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2a500 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a510 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a520 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2a530 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a540 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2a550 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2a560 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a570 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a590 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a5a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2a5b0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
2a5c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a5d0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
2a5e0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2a5f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a600 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a610 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2a620 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2a630 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
2a640 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2a650 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
2a660 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a670 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d    }.  pCur->ix =
2a680 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2a690 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a6a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2a6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2a6c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a6d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
2a6e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2a6f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
2a700 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a710 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2a720 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a730 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a740 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2a750 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2a760 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2a770 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2a780 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2a790 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2a7a0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a7b0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a7c0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2a7d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a7e0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a7f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2a800 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a810 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a830 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2a840 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2a850 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2a860 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a880 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
2a890 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a8a0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2a8b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a8c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a8d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a8e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a8f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a900 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a910 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a920 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a930 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a940 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2a950 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a960 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2a970 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2a980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a990 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a9a0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2a9b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a9c0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2a9d0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2a9e0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2a9f0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2aa00 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2aa10 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2aa20 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2aa30 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2aa40 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2aa50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2aa60 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2aa70 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2aa80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2aa90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2aaa0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2aab0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2aac0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aad0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2aae0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2aaf0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2ab00 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2ab10 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2ab20 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2ab30 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2ab40 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2ab50 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2ab60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2ab70 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2ab80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2ab90 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2aba0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2abb0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2abc0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2abd0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2abe0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2abf0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2ac00 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2ac10 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2ac20 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2ac30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2ac40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2ac50 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2ac60 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2ac70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2ac80 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
2ac90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2aca0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2acb0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2acc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2acd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2ace0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2acf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ad00 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2ad10 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2ad20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2ad40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2ad50 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2ad60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ad70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2ad80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ad90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2ada0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2adb0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2adc0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2add0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ade0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2adf0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2ae00 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2ae10 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2ae20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2ae30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ae40 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ae50 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2ae60 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2ae70 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2ae80 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2ae90 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2aea0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2aeb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aec0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2aed0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2aee0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2aef0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2af00 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2af10 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2af20 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2af30 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2af40 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2af50 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2af60 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2af70 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2af80 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2af90 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2afa0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2afb0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2afc0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2afd0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2afe0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2aff0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2b000 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2b010 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2b020 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2b030 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2b040 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2b050 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2b060 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2b070 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2b080 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2b090 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2b0a0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2b0b0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2b0c0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2b0d0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2b0e0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2b0f0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2b100 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2b110 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2b120 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2b130 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2b140 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2b150 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2b160 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2b170 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2b180 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2b190 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b1a0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b1b0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b1c0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2b1d0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2b1e0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2b1f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2b200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b210 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2b220 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2b230 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2b240 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2b250 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2b260 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2b270 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2b280 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2b2a0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2b2b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2b2c0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2b2d0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2b2e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2b2f0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2b300 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2b310 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2b320 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2b330 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2b340 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2b350 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2b360 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2b370 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2b380 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2b390 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2b3a0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2b3b0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2b3c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2b3d0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2b3e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2b3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b400 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2b410 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2b420 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2b430 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2b440 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2b450 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2b460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2b470 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2b480 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2b490 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2b4a0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2b4b0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2b4c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4e0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2b4f0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2b500 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2b510 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2b520 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2b530 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b540 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b560 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b570 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b580 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2b590 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2b5a0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2b5b0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2b5c0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2b5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b5e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b5f0 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2b600 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2b610 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2b620 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2b630 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2b640 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2b650 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2b660 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2b670 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2b680 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2b690 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2b6a0 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2b6b0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2b6c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2b6d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b6e0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2b6f0 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2b700 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2b710 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2b720 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b730 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b740 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2b750 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2b760 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2b770 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
2b780 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b790 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
2b7a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2b7b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b7c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b7d0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
2b7e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
2b7f0 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
2b800 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
2b810 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
2b820 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
2b830 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
2b840 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
2b850 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
2b860 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
2b870 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
2b880 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2b890 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
2b8a0 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
2b8b0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
2b8c0 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
2b8d0 69 73 20 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c  is ase, only a l
2b8e0 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65  ittle more slowe
2b8f0 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ly */.      if( 
2b900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b  pCur->info.nKey+
2b910 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43  1==intKey && !pC
2b920 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2b930 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2b940 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2b950 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2b960 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2b970 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2b980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2b990 20 20 69 66 28 20 2a 70 52 65 73 3d 3d 30 20 29    if( *pRes==0 )
2b9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43  {.          getC
2b9b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
2b9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75           if( pCu
2b9d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2b9e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2b9f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ba00 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2ba10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ba20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ba30 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
2ba40 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2ba50 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
2ba60 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
2ba70 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
2ba80 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
2ba90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2baa0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2bab0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
2bac0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2bad0 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
2bae0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2baf0 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
2bb00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2bb10 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2bb20 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
2bb30 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
2bb40 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
2bb50 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2bb60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2bb70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2bb80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2bb90 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2bba0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2bbb0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
2bbc0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2bbd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2bbe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bbf0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
2bc00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2bc10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2bc20 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
2bc30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bc40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
2bc50 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2bc60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2bc70 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
2bc80 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2bc90 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2bca0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2bcb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2bcc0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
2bcd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bce0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2bcf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2bd00 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75  intKey==pCur->cu
2bd10 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73  rIntKey );.  ass
2bd20 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
2bd30 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
2bd40 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
2bd50 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
2bd60 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
2bd70 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
2bd80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2bd90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bda0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
2bdb0 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2bde0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
2bdf0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
2be00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
2be10 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2be20 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
2be30 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
2be40 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
2be50 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
2be60 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
2be70 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
2be80 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
2be90 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
2bea0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
2beb0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
2bec0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
2bed0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
2bee0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
2bef0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
2bf00 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
2bf10 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
2bf20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
2bf30 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
2bf40 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
2bf50 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
2bf60 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
2bf70 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
2bf80 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
2bf90 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
2bfa0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2bfb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bfc0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2bfd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bfe0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
2bff0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
2c000 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
2c010 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2c020 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
2c030 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
2c040 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
2c050 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
2c060 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
2c070 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
2c080 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
2c090 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69  ; */.    pCur->i
2c0a0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2c0b0 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
2c0c0 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
2c0d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2c0e0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
2c0f0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2c100 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2c110 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2c120 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2c130 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
2c140 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
2c150 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
2c160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2c170 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
2c180 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
2c190 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2c1a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2c1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c1c0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
2c1d0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
2c1e0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
2c1f0 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
2c200 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2c210 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2c220 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2c230 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
2c240 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2c250 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
2c260 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
2c270 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2c280 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
2c290 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2c2a0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
2c2b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c2c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c2d0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
2c2e0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
2c2f0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2c300 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2c310 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2c330 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2c340 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c350 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2c360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c370 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2c380 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2c390 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2c3a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2c3b0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2c3c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2c3d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c3e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c3f0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c400 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c430 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2c440 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c450 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c460 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c470 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c480 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
2c490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2c4a0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2c4b0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
2c4c0 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
2c4d0 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
2c4e0 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
2c4f0 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2c500 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
2c510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2c520 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
2c530 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
2c540 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
2c550 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
2c560 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
2c570 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
2c580 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
2c590 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
2c5a0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
2c5b0 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
2c5c0 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
2c5d0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2c5e0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
2c5f0 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
2c600 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2c610 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
2c620 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
2c630 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
2c640 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
2c650 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
2c660 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
2c670 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
2c680 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
2c690 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
2c6a0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
2c6b0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
2c6c0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
2c6d0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
2c6e0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
2c6f0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
2c700 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
2c710 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
2c720 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
2c730 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
2c740 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2c750 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
2c760 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2c770 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
2c780 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
2c790 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
2c7a0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2c7b0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2c7c0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
2c7d0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
2c7e0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2c7f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2c800 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
2c810 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2c820 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2c830 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2c840 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2c850 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
2c860 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2c870 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
2c880 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
2c890 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
2c8a0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
2c8b0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
2c8c0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
2c8d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2c8e0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
2c8f0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
2c900 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2c910 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
2c920 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
2c930 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2c940 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
2c950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c960 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2c970 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
2c980 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2c990 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2c9a0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2c9b0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
2c9c0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2c9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c9e0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
2c9f0 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
2ca00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2ca10 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
2ca20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
2ca30 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
2ca40 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
2ca50 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
2ca60 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
2ca70 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
2ca80 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
2ca90 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2caa0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
2cab0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
2cac0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
2cad0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
2cae0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
2caf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2cb00 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2cb10 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2cb20 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
2cb30 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
2cb40 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
2cb50 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
2cb60 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
2cb70 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2cb80 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
2cb90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2cba0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
2cbb0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
2cbc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2cbd0 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
2cbe0 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
2cbf0 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
2cc00 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
2cc10 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2cc20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
2cc30 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
2cc40 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2cc50 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
2cc60 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
2cc70 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
2cc80 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
2cc90 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
2cca0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
2ccb0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
2ccc0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2ccd0 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
2cce0 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
2ccf0 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
2cd00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2cd10 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
2cd20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2cd30 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2cd40 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
2cd50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2cd60 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
2cd70 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2cd80 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
2cd90 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2cda0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
2cdb0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
2cdc0 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
2cdd0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
2cde0 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20  if( nCell<2 ){. 
2cdf0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ce00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ce10 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2ce20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ce30 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2ce40 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
2ce50 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
2ce60 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b  loc( nCell+18 );
2ce70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ce80 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
2ce90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2cea0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2ceb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2cec0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2ced0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2cee0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2cef0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2cf00 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
2cf10 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2cf20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
2cf30 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
2cf40 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
2cf50 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2cf60 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
2cf70 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  vfl;.          i
2cf80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2cf90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2cfa0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2cfb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2cfc0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2cfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cfe0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2cff0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
2d000 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
2d010 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d020 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2d030 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d040 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
2d050 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
2d060 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2d070 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
2d080 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
2d090 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2d0a0 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
2d0b0 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
2d0c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2d0d0 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
2d0e0 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
2d0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2d100 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2d110 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
2d120 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2d130 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2d140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d150 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
2d160 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
2d170 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2d180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d190 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2d1a0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2d1b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2d1c0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
2d1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d1e0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d1f0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d200 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
2d210 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d220 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2d230 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2d240 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2d250 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2d260 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2d270 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
2d280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d290 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
2d2a0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
2d2b0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2d2c0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
2d2d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2d2e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
2d2f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d300 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d310 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  >ix<pCur->apPage
2d320 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2d330 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2d340 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2d350 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2d360 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2d370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d380 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d390 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2d3a0 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2d3b0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2d3c0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2d3d0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2d3e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d3f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d400 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2d410 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2d420 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2d430 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2d440 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2d450 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
2d460 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d470 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2d480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d490 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2d4a0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2d4b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2d4d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d4e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2d4f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2d500 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2d510 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2d520 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2d530 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2d540 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2d550 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2d560 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2d570 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2d580 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2d590 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2d5a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2d5b0 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2d5c0 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2d5d0 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2d5e0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2d5f0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2d600 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2d610 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2d620 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2d630 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2d640 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2d650 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2d660 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2d670 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2d680 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2d690 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2d6a0 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2d6b0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2d6c0 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2d6d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2d6e0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2d6f0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2d700 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2d710 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2d720 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2d730 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2d740 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
2d750 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
2d760 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2d770 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
2d780 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
2d790 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
2d7a0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
2d7b0 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
2d7c0 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
2d7d0 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
2d7e0 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
2d7f0 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
2d800 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
2d810 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
2d820 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2d830 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2d840 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d850 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2d860 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2d870 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
2d880 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
2d890 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
2d8a0 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
2d8b0 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
2d8c0 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
2d8d0 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
2d8e0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2d8f0 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
2d900 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
2d910 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
2d920 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d930 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d940 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
2d950 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
2d960 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50 61 67  EVER(pCur->apPag
2d970 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2d980 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
2d990 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31  n -1;..  for(n=1
2d9a0 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  , i=0; i<=pCur->
2d9b0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
2d9c0 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61   n *= pCur->apPa
2d9d0 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  ge[i]->nCell;.  
2d9e0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
2d9f0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2da00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2da10 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2da20 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2da30 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2da40 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2da50 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2da60 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2da70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2da80 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2da90 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2daa0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2dab0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2dac0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2dad0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2dae0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2daf0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2db00 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2db10 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2db20 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2db30 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2db40 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2db50 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2db60 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2db70 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2db80 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2db90 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2dba0 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2dbb0 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2dbc0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2dbd0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2dbe0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2dbf0 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2dc00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2dc10 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2dc20 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2dc30 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2dc40 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2dc50 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2dc60 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2dc70 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2dc80 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2dc90 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2dca0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2dcb0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2dcc0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2dcd0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2dce0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2dcf0 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2dd00 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2dd10 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2dd20 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2dd30 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2dd40 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2dd50 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2dd60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2dd70 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2dd80 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2dd90 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2dda0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2ddb0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2ddc0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2ddd0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dde0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2ddf0 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2de00 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2de10 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2de20 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2de30 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2de40 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2de50 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2de60 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2de70 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2de80 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2de90 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2dea0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2deb0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2dec0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ded0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2dee0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2def0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2df00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2df10 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2df20 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2df30 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2df40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2df50 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2df60 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2df70 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2df80 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2df90 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2dfa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2dfb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2dfd0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2dfe0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2dff0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2e000 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2e010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e020 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2e030 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e040 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e060 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2e070 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e080 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2e090 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e0a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e0b0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2e0c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2e0d0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2e0e0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e110 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e120 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2e130 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e140 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e150 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2e160 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2e170 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2e180 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2e190 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e1a0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2e1b0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2e1c0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2e1d0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2e1e0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2e1f0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2e200 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2e210 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2e220 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2e230 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2e240 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2e250 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2e260 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2e270 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2e280 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2e290 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2e2a0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2e2b0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2e2c0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2e2d0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2e2e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2e2f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2e300 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2e310 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e320 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e330 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e340 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e350 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2e360 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e370 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2e380 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e390 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e3a0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2e3b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2e3c0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2e3d0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e3e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2e3f0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2e400 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e410 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2e420 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e440 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2e450 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2e460 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2e470 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e480 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2e490 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67  ( pCur->ix>=pPag
2e4a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2e4b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e4c0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2e4d0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2e4e0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2e4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e510 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2e520 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2e530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e540 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2e550 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2e560 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2e570 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2e580 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2e590 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e5a0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2e5b0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2e5c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2e5d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2e5e0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2e5f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e600 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2e610 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2e620 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e630 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2e640 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e650 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2e660 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2e670 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e680 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2e690 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2e6a0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e6b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2e6c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e6d0 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2e6e0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2e6f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2e700 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e710 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2e720 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d  Cur->ix)>=pPage-
2e730 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2e740 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65  ur->ix--;.    re
2e750 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2e760 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2e770 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2e780 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2e790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2e7a0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2e7b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2e7c0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2e7d0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2e7e0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2e7f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2e800 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2e810 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2e820 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2e830 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2e840 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2e850 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2e860 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2e870 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2e880 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2e890 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2e8a0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2e8b0 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2e8c0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2e8d0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2e8e0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2e8f0 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2e900 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2e910 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2e920 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2e930 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2e940 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2e950 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2e960 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2e970 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2e980 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2e990 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2e9a0 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2e9b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2e9c0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2e9d0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2e9e0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2e9f0 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2ea00 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2ea10 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2ea20 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2ea30 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2ea40 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2ea50 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2ea60 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2ea70 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2ea80 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2ea90 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2eaa0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2eab0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2eac0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2ead0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2eae0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2eaf0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2eb00 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2eb10 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2eb20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2eb30 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2eb40 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2eb50 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2eb60 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2eb70 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2eb80 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2eb90 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2eba0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2ebb0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2ebc0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2ebd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2ebe0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2ebf0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2ec00 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2ec10 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2ec20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2ec30 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2ec40 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2ec50 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2ec60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ec70 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2ec80 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2ec90 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2eca0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ecb0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ecc0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2ecd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2ece0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2ecf0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2ed00 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2ed10 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ed20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2ed30 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2ed40 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2ed50 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2ed60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2ed70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ed80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2ed90 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2eda0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2edb0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2edc0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2edd0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ede0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2edf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ee00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ee10 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2ee20 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2ee30 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ee40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2ee50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ee60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2ee70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2ee80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ee90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2eea0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2eeb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2eec0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2eed0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2eee0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2eef0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2ef00 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2ef10 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2ef20 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2ef30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ef40 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2ef50 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ef60 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2ef70 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2ef80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ef90 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2efa0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2efb0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2efc0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2efd0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
2efe0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2eff0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2f000 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2f010 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2f020 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f030 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2f040 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2f050 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2f060 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2f070 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
2f080 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2f090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2f0a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2f0b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2f0c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2f0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f0e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2f0f0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2f100 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2f110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f120 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2f130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f140 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2f150 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  & (BTCF_ValidOvf
2f160 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
2f170 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70  Cur->ix--;.    p
2f180 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f190 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f1a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2f1b0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2f1c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f1d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f1e0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2f1f0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2f200 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2f210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2f220 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f230 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2f240 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2f250 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2f260 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28  pRes){.  assert(
2f270 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f280 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f290 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2f2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2f2b0 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2f2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f2d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f2e0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f2f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f300 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2f310 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2f320 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2f330 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2f340 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
2f350 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2f360 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
2f370 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f380 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
2f390 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c  Cur->ix==0.   ||
2f3a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2f3b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2f3c0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
2f3d0 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
2f3e0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2f3f0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b   }.  pCur->ix--;
2f400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2f410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
2f420 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2f430 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2f440 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2f450 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
2f460 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2f470 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
2f480 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
2f490 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
2f4a0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2f4b0 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
2f4c0 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
2f4d0 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
2f4e0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
2f4f0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
2f500 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
2f510 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
2f520 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f530 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
2f540 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
2f550 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
2f560 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2f570 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
2f580 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
2f590 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
2f5a0 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
2f5b0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
2f5c0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
2f5d0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2f5e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2f5f0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2f600 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2f610 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2f620 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2f630 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2f640 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f650 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2f660 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2f670 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2f680 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2f690 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2f6a0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2f6b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2f6c0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2f6d0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2f6e0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2f6f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2f700 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2f710 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2f720 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2f730 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2f740 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2f750 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2f760 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2f770 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2f780 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2f790 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2f7a0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2f7b0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2f7c0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2f7d0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2f7e0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2f7f0 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2f800 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2f810 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2f820 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2f830 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2f840 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f850 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2f860 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2f870 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2f880 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2f890 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2f8a0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2f8b0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2f8c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2f8d0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2f8e0 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2f8f0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2f900 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2f910 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2f920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2f930 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2f940 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2f950 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2f960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2f970 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2f980 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2f990 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2f9a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2f9b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2f9c0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2f9d0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2f9e0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2f9f0 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2fa00 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2fa10 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2fa20 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2fa30 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2fa40 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2fa50 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2fa60 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2fa70 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2fa80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2fa90 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2faa0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2fab0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2fac0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2fad0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2fae0 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2faf0 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2fb00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2fb10 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2fb20 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2fb30 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2fb40 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2fb50 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2fb60 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2fb70 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2fb80 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2fb90 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2fba0 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2fbb0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2fbc0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2fbd0 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2fbe0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2fbf0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2fc00 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2fc10 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2fc20 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2fc30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2fc40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2fc50 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2fc60 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2fc70 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2fc80 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2fc90 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2fca0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2fcb0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2fcc0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2fcd0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2fce0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2fcf0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2fd00 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
2fd10 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
2fd20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2fd30 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
2fd40 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2fd50 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2fd60 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2fd70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2fd80 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2fd90 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2fda0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2fdb0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2fdc0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2fdd0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2fde0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2fdf0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2fe00 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2fe10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fe20 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2fe30 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2fe40 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2fe50 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2fe60 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2fe70 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2fe80 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2fe90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2fea0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2feb0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2fec0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2fed0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2fee0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2fef0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ff00 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2ff10 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2ff20 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2ff30 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2ff40 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2ff50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2ff60 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ff70 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2ff80 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2ff90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2ffa0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2ffb0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2ffc0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2ffd0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2ffe0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2fff0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
30000 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
30010 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
30020 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
30030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30040 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
30050 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
30060 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30070 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
30080 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
30090 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
300a0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
300b0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
300c0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
300d0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
300e0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
300f0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
30100 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
30110 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
30120 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
30130 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
30140 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
30150 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
30160 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
30170 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
30180 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
30190 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
301a0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
301b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
301c0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
301d0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
301e0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
301f0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
30200 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
30210 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
30220 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
30230 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
30240 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
30250 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
30260 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
30270 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
30280 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30290 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
302a0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
302b0 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
302c0 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
302d0 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
302e0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
302f0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
30300 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
30310 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30320 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
30330 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
30340 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
30350 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
30360 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
30370 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
30380 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30390 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
303a0 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
303b0 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
303c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
303d0 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
303e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
303f0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30400 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
30410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30420 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
30430 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
30440 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
30450 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
30460 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
30470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30480 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
30490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
304a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
304b0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
304c0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
304d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
304e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
304f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
30500 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30510 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
30530 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
30540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30550 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
30560 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
30570 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
30580 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
30590 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
305a0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
305b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
305c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
305d0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
305e0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
305f0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
30600 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
30610 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
30620 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
30630 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
30640 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
30650 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
30660 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
30670 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
30680 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
30690 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
306a0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
306b0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
306c0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
306d0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
306e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
306f0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
30700 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30710 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30720 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
30730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
30750 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30760 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30770 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
30780 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
30790 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
307a0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
307b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
307c0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
307d0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
307e0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
307f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
30800 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
30810 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
30820 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
30830 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
30840 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
30850 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
30860 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
30870 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
30880 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
30890 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
308a0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
308b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
308c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
308d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
308e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
308f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30900 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30910 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
30920 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30930 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
30940 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
30950 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
30960 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
30970 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
30980 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
30990 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
309a0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
309b0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
309c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
309d0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
309e0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
309f0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
30a00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30a10 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
30a20 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
30a30 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
30a40 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30a50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
30a60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30a70 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30a80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
30a90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30aa0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30ab0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30ad0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
30ae0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
30af0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
30b00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
30b10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
30b20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
30b40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30b50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30b60 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
30b70 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30b80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
30b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30bb0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30bc0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
30bd0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
30be0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
30bf0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
30c00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30c20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
30c40 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
30c50 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
30c60 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
30c70 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
30c80 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
30c90 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
30ca0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
30cb0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
30cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
30cd0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
30ce0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30cf0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
30d00 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
30d10 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
30d20 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30d30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
30d40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30d50 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
30d60 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
30d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30d80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
30d90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30da0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30db0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30dc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30dd0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
30de0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
30df0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30e00 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
30e10 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
30e20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30e50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30e60 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
30e80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e90 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
30ea0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30eb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30ed0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30ee0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
30ef0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30f00 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30f10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30f20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30f30 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30f40 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
30f50 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30f60 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30f70 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30f80 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
30f90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
30fa0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
30fb0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
30fc0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
30fd0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
30fe0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
30ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31000 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
31010 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
31020 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31030 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
31040 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
31050 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
31060 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31070 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
31080 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
31090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
310a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
310b0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
310c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
310d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
310e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
310f0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31100 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31120 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31130 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
31140 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
31150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
31170 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
31180 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31190 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
311a0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
311b0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
311c0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
311d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
311e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
311f0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
31200 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
31210 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
31220 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
31230 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
31240 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
31250 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
31260 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
31270 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
31280 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
31290 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
312a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
312b0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
312c0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
312d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
312e0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
312f0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
31300 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
31310 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
31320 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
31330 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
31340 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
31350 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
31360 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
31380 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31390 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
313a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
313b0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
313c0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
313d0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
313e0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
313f0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
31400 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
31410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
31420 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
31430 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
31440 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
31450 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
31470 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
31480 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
31490 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
314a0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
314b0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
314c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
314d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
314e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
314f0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
31500 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
31510 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
31520 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
31530 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
31540 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31550 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
31560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
31570 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
31580 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31590 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
315a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
315b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
315c0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
315d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
315e0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
315f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
31600 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
31610 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
31620 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
31630 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
31640 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
31650 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31660 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
31670 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
31680 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
31690 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
316a0 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
316b0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
316c0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
316d0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
316e0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
316f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31700 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
31710 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
31720 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
31730 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31740 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31750 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
31760 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
31770 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
31780 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31790 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
317a0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
317b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
317c0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
317d0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
317e0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
317f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
31800 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
31810 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
31820 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
31830 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
31840 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
31850 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
31860 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
31870 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31880 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
31890 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
318a0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
318b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
318c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
318d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
318e0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
318f0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
31900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31930 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
31940 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31950 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
31960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31980 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31990 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
319a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
319b0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
319c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
319d0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
319e0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
319f0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
31a00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
31a10 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
31a20 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
31a30 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
31a40 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
31a50 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
31a60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
31a70 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
31a80 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
31a90 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
31aa0 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
31ab0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
31ac0 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
31ad0 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
31ae0 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
31af0 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
31b00 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
31b10 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
31b20 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
31b30 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
31b40 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
31b50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
31b60 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
31b70 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
31b80 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
31b90 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
31ba0 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
31bb0 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
31bc0 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
31bd0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
31be0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
31bf0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
31c00 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
31c10 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
31c20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
31c30 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
31c40 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
31c50 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
31c60 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
31c70 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
31c80 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
31c90 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
31ca0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31cb0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
31cc0 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
31cd0 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
31ce0 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
31cf0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
31d00 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
31d10 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
31d20 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
31d30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
31d40 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
31d50 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
31d60 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
31d70 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
31d80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
31d90 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
31da0 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
31db0 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
31dc0 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
31dd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31de0 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
31df0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
31e00 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31e10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
31e20 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
31e30 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
31e40 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
31e50 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
31e60 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
31e70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31e80 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
31e90 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31ea0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31eb0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
31ec0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
31ed0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
31ee0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
31ef0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
31f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31f10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31f20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31f30 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
31f40 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
31f50 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
31f60 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
31f70 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
31f80 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
31f90 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
31fa0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
31fb0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
31fc0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
31fd0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
31fe0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
31ff0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
32000 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
32010 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
32020 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
32030 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
32040 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
32050 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
32060 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32070 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
32080 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
32090 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
320a0 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
320b0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
320c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
320d0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
320e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
320f0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
32100 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
32110 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
32120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32140 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32150 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
32160 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
32170 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
32180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32190 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
321a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
321b0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
321c0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
321d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
321e0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
321f0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
32200 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
32210 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
32220 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
32230 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
32240 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
32250 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
32260 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
32270 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32280 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
32290 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
322a0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
322b0 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
322c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
322d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
322e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
322f0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
32300 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
32310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32320 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
32330 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
32340 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
32350 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
32360 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
32370 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
32380 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
32390 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
323a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
323b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
323c0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
323d0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
323e0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
323f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
32400 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
32410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32420 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
32430 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
32440 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
32450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
32460 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
32470 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
32480 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
32490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
324a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
324b0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
324c0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
324d0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
324e0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
324f0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
32500 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
32510 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
32520 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
32530 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
32540 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
32550 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
32560 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
32570 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
32580 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
32590 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
325a0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
325b0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
325c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
325d0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
325e0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
325f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
32600 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
32610 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
32620 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
32630 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
32640 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
32650 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
32660 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
32670 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
32680 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
32690 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
326a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
326b0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
326c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
326d0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
326e0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
326f0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
32700 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32710 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
32720 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
32730 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
32740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32750 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32760 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
32770 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
32780 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32790 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
327a0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
327b0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
327c0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
327d0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
327e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
327f0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
32800 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
32810 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32840 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
32850 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
32860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32870 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32880 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
32890 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
328a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
328b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
328c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
328d0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
328e0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
328f0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
32900 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
32910 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
32920 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
32930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
32940 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
32950 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
32960 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
32970 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
32980 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
32990 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
329a0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
329b0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
329c0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
329d0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
329e0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
329f0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
32a00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32a10 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
32a20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
32a30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32a40 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
32a50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32a60 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
32a70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32a80 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
32a90 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
32aa0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
32ab0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
32ac0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
32ad0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
32ae0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
32af0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
32b00 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
32b10 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
32b20 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
32b30 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
32b40 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
32b50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
32b60 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
32b70 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
32b80 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
32b90 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
32ba0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
32bb0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
32bc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
32bd0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32be0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
32bf0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
32c00 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
32c10 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
32c20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32c30 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
32c40 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
32c50 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
32c60 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
32c70 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
32c80 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
32c90 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
32ca0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
32cb0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
32cc0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
32cd0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
32ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
32cf0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
32d10 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
32d20 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
32d30 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
32d40 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
32d50 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
32d60 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
32d70 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
32d80 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
32d90 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
32da0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32db0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
32dc0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
32dd0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
32de0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
32df0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
32e00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
32e10 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
32e20 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
32e30 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
32e40 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
32e50 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
32e60 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
32e70 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
32e80 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
32e90 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
32ea0 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
32eb0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
32ec0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
32ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32ee0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32ef0 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
32f00 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
32f10 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
32f20 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32f30 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
32f40 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32f50 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
32f60 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
32f70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32f80 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32f90 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32fa0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
32fb0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
32fc0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
32fd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
32fe0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
32ff0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
33000 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
33010 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
33020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
33040 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
33050 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
33060 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
33070 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
33080 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
33090 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
330a0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
330b0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
330c0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
330d0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
330e0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
330f0 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
33100 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
33110 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
33120 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
33130 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
33140 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
33150 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
33160 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
33170 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
33180 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
33190 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
331a0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
331b0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
331c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
331d0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
331e0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
331f0 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
33200 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
33210 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
33220 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
33230 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
33240 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
33250 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
33260 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
33270 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
33280 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
33290 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
332a0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
332b0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
332c0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
332d0 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
332e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
332f0 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
33300 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
33310 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
33320 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
33330 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
33340 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
33350 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
33360 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
33370 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
33380 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
33390 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
333a0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
333b0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
333c0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
333d0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
333e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
333f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
33400 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
33410 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
33420 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
33430 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
33440 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
33450 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
33460 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
33470 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
33480 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
33490 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
334a0 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
334b0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
334c0 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
334d0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
334e0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
334f0 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
33500 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33510 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33520 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
33530 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33550 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
33560 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
33570 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
33580 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
33590 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
335a0 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
335b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
335c0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
335d0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
335e0 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
335f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
33600 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
33610 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33630 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
33640 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
33650 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
33660 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
33670 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
33680 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
33690 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
336a0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
336b0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
336c0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
336d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
336e0 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
336f0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
33700 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
33710 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
33720 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
33730 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
33740 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
33750 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
33760 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
33770 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
33780 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
33790 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
337a0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
337b0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
337c0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
337d0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
337e0 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
337f0 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
33800 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
33810 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
33820 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
33830 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
33840 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
33850 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
33860 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
33870 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
33880 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
33890 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
338a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
338b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
338c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
338d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
338e0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
338f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
33900 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
33910 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
33920 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
33930 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
33940 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
33950 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33960 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
33970 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
33980 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
33990 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
339a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
339b0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
339c0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
339d0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
339e0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
339f0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
33a00 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
33a10 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
33a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
33a30 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
33a40 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
33a50 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
33a60 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
33a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
33a80 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
33a90 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
33aa0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
33ab0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
33ac0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
33ad0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
33ae0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
33af0 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
33b00 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
33b10 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
33b20 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
33b30 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
33b40 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
33b50 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
33b60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
33b70 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
33b80 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
33b90 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33ba0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
33bb0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
33bc0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
33bd0 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
33be0 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
33bf0 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
33c00 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
33c10 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
33c20 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
33c30 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33c40 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
33c50 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  pBt;.  Pgno ovfl
33c60 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
33c70 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
33c80 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
33c90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33cb0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
33cc0 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
33cd0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
33ce0 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
33cf0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63   if( pInfo->nLoc
33d00 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  al==pInfo->nPayl
33d10 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  oad ){.    retur
33d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
33d30 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
33d40 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
33d50 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
33d60 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
33d70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a  Cell+pInfo->nSiz
33d80 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  e-1 > pPage->aDa
33d90 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
33da0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
33db0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33dc0 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
33dd0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
33de0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
33df0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
33e00 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
33e10 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
33e20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
33e30 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
33e40 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
33e50 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
33e60 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
33e70 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
33e80 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
33e90 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
33ea0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
33eb0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
33ec0 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
33ed0 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
33ee0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
33ef0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
33f00 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
33f10 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
33f20 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
33f30 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
33f40 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33f50 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
33f60 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
33f70 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
33f80 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
33f90 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
33fa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
33fb0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
33fc0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
33fd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
33fe0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
33ff0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
34000 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
34010 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
34020 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
34030 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
34040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34050 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
34070 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
34080 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
34090 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
340a0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
340b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
340c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
340d0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
340e0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
340f0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
34100 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
34110 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
34120 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
34130 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
34140 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
34150 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
34160 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
34170 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
34180 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
34190 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
341a0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
341b0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
341c0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
341d0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
341e0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
341f0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
34200 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
34210 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
34220 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
34230 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
34240 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
34250 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
34260 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
34270 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
34280 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
34290 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
342a0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
342b0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
342c0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
342d0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
342e0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
342f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
34300 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
34310 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
34320 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
34330 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
34340 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
34350 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
34360 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
34370 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
34380 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
34390 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
343a0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
343b0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
343c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
343d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
343e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
343f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
34400 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
34410 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
34420 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
34430 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
34440 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34450 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
34460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
34470 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34480 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
34490 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
344a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
344b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
344c0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
344d0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
344e0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
344f0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
34500 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
34510 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
34520 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
34530 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
34540 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
34550 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
34560 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
34570 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
34580 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34590 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
345a0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
345b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
345c0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
345d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
345e0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
345f0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
34600 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
34610 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
34620 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
34630 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
34640 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
34650 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
34660 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
34670 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
34680 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
34690 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
346a0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
346b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
346c0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
346d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
346f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
34700 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
34710 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
34720 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
34730 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
34740 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
34750 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
34760 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
34770 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
34780 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
34790 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
347a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
347b0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
347c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
347d0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
347e0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
347f0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
34800 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
34810 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
34820 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
34830 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
34840 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
34850 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
34860 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
34870 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
34880 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
34890 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
348a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
348b0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
348c0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
348d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
348e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
348f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
34900 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
34910 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
34920 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
34930 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
34940 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
34950 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
34960 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
34970 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
34980 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
34990 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
349a0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
349b0 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
349c0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
349d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
349e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
349f0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34a00 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
34a10 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
34a20 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
34a30 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
34a40 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
34a50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
34a60 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
34a70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
34a80 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
34a90 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
34aa0 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
34ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34ac0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
34ad0 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
34ae0 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
34af0 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
34b00 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
34b10 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
34b20 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
34b30 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
34b40 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
34b50 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
34b60 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
34b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
34b80 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
34b90 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
34ba0 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
34bb0 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
34bc0 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
34bd0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
34be0 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
34bf0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
34c00 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
34c10 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
34c20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
34c30 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
34c40 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
34c50 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34c60 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
34c70 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
34c80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34c90 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
34ca0 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
34cb0 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
34cc0 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
34cd0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
34ce0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
34cf0 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
34d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
34d10 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
34d20 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
34d30 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
34d40 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
34d50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
34d60 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
34d70 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
34d80 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
34d90 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34da0 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
34db0 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
34dc0 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
34dd0 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
34de0 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
34df0 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
34e00 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
34e10 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34e20 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
34e30 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
34e40 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
34e50 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
34e60 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
34e70 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
34e80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
34e90 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
34ea0 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
34eb0 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
34ec0 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
34ed0 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
34ee0 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
34ef0 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
34f00 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
34f10 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
34f20 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
34f30 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
34f40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34f50 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
34f60 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
34f70 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
34f80 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
34f90 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
34fa0 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
34fb0 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
34fc0 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
34fd0 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
34fe0 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
34ff0 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
35000 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
35010 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
35020 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
35030 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
35040 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
35050 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
35060 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
35070 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
35080 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
35090 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
350a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
350b0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
350c0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
350d0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
350e0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
350f0 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
35100 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
35110 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
35120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
35130 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
35140 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
35150 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
35160 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
35170 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
35180 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
35190 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
351a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
351b0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
351c0 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
351d0 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
351e0 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
351f0 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
35200 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
35210 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
35220 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35230 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
35240 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
35250 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
35260 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
35270 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35280 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
35290 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
352a0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
352b0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
352c0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
352d0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
352e0 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
352f0 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
35300 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
35310 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35320 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
35330 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
35340 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
35350 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
35360 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
35370 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
35380 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
35390 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
353a0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
353b0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
353c0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
353d0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
353e0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
353f0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
35400 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
35410 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
35420 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
35430 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
35440 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
35450 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
35460 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
35470 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
35480 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
35490 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
354a0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
354b0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
354c0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
354d0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
354e0 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
354f0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
35500 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
35510 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
35520 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
35530 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
35540 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
35550 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
35560 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
35570 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
35580 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
35590 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
355a0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
355b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
355c0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
355d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
355e0 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
355f0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
35600 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
35610 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
35620 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
35630 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
35640 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
35650 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
35660 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
35670 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35680 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
35690 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
356a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
356b0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
356c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
356d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
356e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
356f0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
35700 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
35710 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
35720 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
35730 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
35740 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
35750 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
35760 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
35770 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
35780 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
35790 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
357a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
357b0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
357c0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
357d0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
357e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
357f0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
35800 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
35810 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
35820 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
35830 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
35840 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
35850 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
35860 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
35870 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
35880 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
35890 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
358a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
358b0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
358c0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
358d0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
358e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
358f0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
35900 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
35910 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
35920 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
35930 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
35940 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
35950 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
35960 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
35970 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
35980 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35990 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
359a0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
359b0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
359c0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
359d0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
359e0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
359f0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
35a00 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
35a10 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
35a20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
35a30 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
35a40 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
35a50 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
35a60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
35a70 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
35a80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35a90 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
35aa0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35ab0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
35ac0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
35ad0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
35ae0 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
35af0 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
35b00 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
35b10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
35b20 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
35b30 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
35b40 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
35b50 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
35b60 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
35b70 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35b80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35b90 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
35ba0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
35bb0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
35bc0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
35bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
35be0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
35bf0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
35c00 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
35c10 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
35c20 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
35c30 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
35c40 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
35c50 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
35c60 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
35c70 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
35c80 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a  eLeft -= n;.  }.
35c90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
35ca0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
35cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
35cc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
35cd0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
35ce0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
35cf0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
35d00 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
35d10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
35d20 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
35d30 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
35d40 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
35d50 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
35d60 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
35d70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
35d80 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
35d90 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
35da0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
35db0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
35dc0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
35dd0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
35de0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
35df0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
35e00 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
35e10 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
35e20 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
35e30 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
35e40 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
35e50 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
35e60 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
35e70 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
35e80 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
35e90 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
35ea0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
35eb0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
35ec0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
35ed0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
35ee0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
35ef0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
35f00 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
35f10 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
35f20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
35f30 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
35f40 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
35f50 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
35f60 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
35f70 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
35f80 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
35f90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
35fa0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
35fb0 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
35fc0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
35fd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35fe0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35ff0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36000 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36010 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36020 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
36030 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
36040 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
36050 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
36060 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
36070 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
36080 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
36090 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
360a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
360b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
360c0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
360d0 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
360e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
360f0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
36100 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
36110 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
36120 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
36130 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36140 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
36150 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36160 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
36170 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
36180 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
36190 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
361a0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
361b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
361c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
361d0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
361e0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
361f0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
36200 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
36210 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
36220 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
36230 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
36240 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36250 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
36260 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
36270 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
36280 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
36290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362a0 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
362b0 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
362c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
362d0 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
362e0 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
362f0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
36300 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
36310 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
36320 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
36330 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
36340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
36350 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
36360 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
36370 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
36380 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
36390 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
363a0 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
363b0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
363c0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
363d0 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
363e0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
363f0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
36400 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
36410 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
36420 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
36430 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
36440 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
36450 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
36460 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
36470 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
36480 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
36490 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
364a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
364b0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
364c0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
364d0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
364e0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
364f0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
36500 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
36510 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
36520 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
36530 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
36540 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
36550 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20  ted..**.** *pRC 
36560 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f  must be SQLITE_O
36570 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K when this rout
36580 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
36590 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
365a0 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
365b0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
365c0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
365d0 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
365e0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
365f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
36600 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
36610 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
36620 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
36630 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
36640 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
36650 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
36660 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
36670 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
36680 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
36690 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
366a0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
366b0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
366c0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
366d0 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
366e0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
366f0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
36700 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
36710 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
36720 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
36730 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
36740 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
36750 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
36760 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
36770 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
36780 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
36790 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
367a0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
367b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
367c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
367d0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
367e0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
367f0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
36800 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20  /.  u8 *pIns;   
36810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
36820 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  nt in pPage->aCe
36830 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f  llIdx[] where no
36840 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a   cell inserted *
36850 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  /..  assert( *pR
36860 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  C==SQLITE_OK );.
36870 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
36880 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
36890 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
368a0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
368b0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
368c0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
368d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
368e0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
368f0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
36900 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
36910 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
36920 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
36930 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
36940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
36950 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
36960 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
36970 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
36980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36990 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
369a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
369b0 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
369c0 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
369d0 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
369e0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
369f0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
36a00 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
36a10 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
36a20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
36a30 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
36a40 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
36a50 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
36a60 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
36a70 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
36a80 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
36a90 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
36aa0 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
36ab0 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
36ac0 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
36ad0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
36ae0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
36af0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
36b00 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
36b10 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
36b20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
36b30 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
36b40 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
36b50 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
36b60 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
36b70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
36b80 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
36b90 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
36ba0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
36bb0 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
36bc0 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
36bd0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
36be0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
36bf0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
36c00 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
36c10 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
36c20 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
36c30 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72  +;.    /* Compar
36c40 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72  ison against Arr
36c50 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77  aySize-1 since w
36c60 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20  e hold back one 
36c70 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a  extra slot.    *
36c80 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e  * as a contingen
36c90 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  cy.  In other wo
36ca0 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20  rds, never need 
36cb0 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72  more than 3 over
36cc0 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  flow.    ** slot
36cd0 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f  s but 4 are allo
36ce0 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62  cated, just to b
36cf0 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61  e safe. */.    a
36d00 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79  ssert( j < Array
36d10 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
36d20 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61  fl)-1 );.    pPa
36d30 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
36d40 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
36d50 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
36d60 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
36d70 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
36d80 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
36d90 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
36da0 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
36db0 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
36dc0 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
36dd0 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
36de0 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
36df0 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
36e00 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
36e10 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
36e20 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
36e30 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
36e40 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
36e50 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
36e60 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
36e70 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
36e80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
36e90 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
36ea0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
36eb0 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
36ec0 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
36ed0 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
36ee0 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
36ef0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
36f00 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
36f10 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
36f20 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
36f30 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
36f40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36f50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36f60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
36f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36f80 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
36f90 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
36fa0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
36fb0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36fc0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
36fd0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
36fe0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
36ff0 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
37000 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
37010 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
37020 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
37030 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
37040 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
37050 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
37060 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
37070 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
37080 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
37090 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
370a0 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
370b0 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
370c0 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
370d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
370e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
370f0 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
37100 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
37110 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
37120 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
37130 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
37140 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
37150 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
37160 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37170 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
37180 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
37190 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
371a0 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
371b0 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
371c0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
371d0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
371e0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
371f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
37200 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
37210 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
37220 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
37230 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
37240 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
37250 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
37260 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
37270 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
37280 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
37290 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
372a0 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
372b0 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
372c0 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
372d0 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
372e0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
372f0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
37300 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
37310 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
37320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37330 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37340 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
37350 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
37360 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
37370 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
37380 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
37390 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
373a0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
373b0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
373c0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
373d0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
373e0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
373f0 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
37400 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
37410 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
37420 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
37430 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
37440 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
37450 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
37460 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
37470 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
37480 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
37490 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
374a0 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  ight be held on 
374b0 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
374c0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
374d0 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
374e0 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
374f0 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
37500 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
37510 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37520 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
37530 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
37540 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
37550 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
37560 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
37570 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
37580 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
37590 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
375a0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
375b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
375c0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
375d0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
375e0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
375f0 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
37600 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
37610 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
37620 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
37630 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
37640 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
37650 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
37660 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
37670 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
37680 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
37690 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
376a0 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
376b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
376c0 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
376d0 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
376e0 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
376f0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
37700 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
37710 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
37720 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
37730 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37740 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
37750 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
37760 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
37770 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
37780 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
37790 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
377a0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
377b0 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
377c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
377d0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
377e0 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
377f0 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
37800 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
37810 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
37820 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
37830 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
37840 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
37850 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
37860 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
37870 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
37880 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
37890 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
378a0 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
378b0 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
378c0 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
378d0 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
378e0 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
378f0 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
37900 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
37910 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
37920 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
37930 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
37940 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
37950 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
37960 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
37970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37980 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37990 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
379a0 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
379b0 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
379c0 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
379d0 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
379e0 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
379f0 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
37a00 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
37a10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
37a20 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
37a30 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
37a40 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
37a50 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
37a60 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
37a70 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
37a80 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
37a90 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
37aa0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
37ab0 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
37ac0 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
37ad0 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
37ae0 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
37af0 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
37b00 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
37b10 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
37b20 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
37b30 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
37b40 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
37b50 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
37b60 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
37b70 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
37b80 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
37b90 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
37ba0 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
37bb0 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
37bc0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
37be0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
37bf0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c10 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
37c20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
37c30 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
37c40 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37c50 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37c60 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
37c70 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37c90 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
37ca0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
37cb0 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
37cc0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
37cd0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
37ce0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
37cf0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
37d00 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
37d10 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
37d20 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
37d30 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
37d40 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
37d50 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
37d60 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
37d70 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
37d80 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
37d90 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
37da0 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
37db0 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
37dc0 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
37dd0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
37de0 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
37df0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
37e00 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
37e10 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
37e20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
37e30 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
37e40 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
37e50 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
37e60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
37e70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
37e80 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
37e90 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
37ea0 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
37eb0 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20  aData,pEnd) ){. 
37ec0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
37ed0 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
37ee0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
37ef0 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
37f00 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
37f10 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d  ellptr, (pData -
37f20 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
37f30 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
37f40 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65   if( pData < pCe
37f50 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53  llptr ) return S
37f60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37f70 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  PT;.    memcpy(p
37f80 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43  Data, pCell, szC
37f90 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  ell[i]);.    ass
37fa0 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
37fb0 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
37fc0 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
37fd0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
37fe0 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
37ff0 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]!=pPg->xCellS
38000 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
38010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
38020 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
38030 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
38040 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
38050 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
38060 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
38070 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
38080 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
38090 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
380a0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
380b0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
380c0 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
380d0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
380e0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
380f0 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
38100 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d    aData[hdr+7] =
38110 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20   0x00;.  return 
38120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
38130 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
38140 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
38150 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
38160 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
38170 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74  y szCell.** cont
38180 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
38190 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
381a0 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
381b0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
381c0 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20   to .** add the 
381d0 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20  cells stored in 
381e0 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67  the array to pag
381f0 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e  e pPg. If it can
38200 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a  not (because .**
38210 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
38220 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74  to be defragment
38230 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65  ed before the ce
38240 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e  lls will fit), n
38250 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65  on-zero.** is re
38260 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
38270 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20  e, if the cells 
38280 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73  are added succes
38290 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a  sfully, zero is.
382a0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
382b0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c  ** Argument pCel
382c0 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  lptr points to t
382d0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
382e0 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
382f0 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72  er array.** (par
38300 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74  t of page pPg) t
38310 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65  o populate. Afte
38320 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d  r cell apCell[0]
38330 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
38340 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c  he.** page body,
38350 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74   a 16-bit offset
38360 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70   is written to p
38370 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20  Cellptr. And so 
38380 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  on, for each.** 
38390 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
383a0 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  y. It is the res
383b0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
383c0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
383d0 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ure.** that it i
383e0 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72  s safe to overwr
383f0 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66  ite this part of
38400 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
38410 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57  r array..**.** W
38420 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
38430 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
38440 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74  Data points to t
38450 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
38460 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  .** content ar